Ⅰ 如何编译note.js
先cd 到server.js的路径下 再 note server.js
Ⅱ 如何正确理解javascript的模块化
模块化在项目中十分的重要,一个复杂的项目肯定有很多相似的功能模块,如果每次都需要重新编写模块肯定既费时又耗力。但是引用别人编写模块的前提是要有统一的“打开姿势”,如果每个人有各自的写法,那么肯定会乱套,下面介绍几种JS的模块化的规范。
一:模块化进程一:script标签
这是最原始的 JavaScript 文件加载方式,如果把每一个文件看做是一个模块,那么他们的接口通常是暴露在全局作用域下,也就是定义在 window 对象中,不同模块的接口调用都是一个作用域中,一些复杂的框架,会使用命名空间的概念来组织这些模块的接口。
缺点:
1、污染全局作用域
2、开发人员必须主观解决模块和代码库的依赖关系
3、文件只能按照script标签的书写顺序进行加载
4、在大型项目中各种资源难以管理,长期积累的问题导致代码库混乱不堪
二:模块化进程二:CommonJS规范
该规范的核心思想是允许模块通过require方法来同步加载所要依赖的其他模块,然后通过 exports 或 mole.exports 来导出需要暴露的接口。
require("mole");
require("../file.js");
exports.doStuff = function(){};
mole.exports = someValue;
优点:
1、简单并容易使用
2、服务器端模块便于重用
缺点:
1、同步的模块加载方式不适合在浏览器环境中,同步意味着阻塞加载,浏览器资源是异步加载的
2、不能非阻塞的并行加载多个模块
mole.exports与exports的区别
1、exports 是指向的 mole.exports 的引用
2、mole.exports 初始值为一个空对象 {},所以 exports 初始值也是 {}
3、require() 返回的是 mole.exports 而不是 exports
exports示例:
// app.js
var circle = require('./circle');
console.log(circle.area(4));
// circle.js
exports.area = function(r){
return r * r * Math.PI;
}
mole.exports示例:
// app.js
var area = require('./area');
console.log(area(4));
// area.js
mole.exports = function(r){
return r * r * Math.PI;
}
错误的情况:
// app.js
var area = require('./area');
console.log(area(4));
// area.js
exports = function(r){
return r * r * Math.PI;
}
其实是对 exports 进行了覆盖,也就是说 exports 指向了一块新的内存(内容为一个计算圆面积的函数),也就是说 exports 和 mole.exports 不再指向同一块内存,也就是说此时 exports 和 mole.exports 毫无联系,也就是说 mole.exports 指向的那块内存并没有做任何改变,仍然为一个空对象{},也就是说area.js导出了一个空对象,所以我们在 app.js 中调用 area(4) 会报 TypeError: object is not a function 的错误。
总结:当我们想让模块导出的是一个对象时, exports 和 mole.exports 均可使用(但 exports 也不能重新覆盖为一个新的对象),而当我们想导出非对象接口时,就必须也只能覆盖 mole.exports 。
三:模块化进程三:AMD规范
由于浏览器端的模块不能采用同步的方式加载,会影响后续模块的加载执行,因此AMD(Asynchronous Mole Definition异步模块定义)规范诞生了。
AMD标准中定义了以下两个API
1、require([mole], callback);
2、define(id, [depends], callback);
require接口用来加载一系列模块,define接口用来定义并暴露一个模块。
示例:
define("mole", ["dep1", "dep2"], function(d1, d2){
return someExportedValue;
});
require(["mole", "../file"], function(mole, file){ /* ... */ });
优点:
1、适合在浏览器环境中异步加载模块
2、可以并行加载多个模块
缺点:
1、提高了开发成本,代码的阅读和书写比较困难,模块定义方式的语义不顺畅
2、不符合通用的模块化思维方式,是一种妥协的实现
四:模块化进程四:CMD规范
CMD(Common Mole Definition)规范和AMD很相似,尽量保持简单,并与CommonJS和Node.js的 Moles 规范保持了很大的兼容性。在CMD规范中,一个模块就是一个文件。
示例:
define(function(require, exports, mole){
var $ = require('jquery');
var Spinning = require('./spinning');
exports.doSomething = ...
mole.exports = ...
})
优点:
1、依赖就近,延迟执行
2、可以很容易在 Node.js 中运行
缺点:
1、依赖 SPM 打包,模块的加载逻辑偏重
AMD和CMD的区别
AMD和CMD起来很相似,但是还是有一些细微的差别,让我们来看一下他们的区别在哪里:
1、对于依赖的模块,AMD是提前执行,CMD是延迟执行。
2、AMD推崇依赖前置;CMD推崇依赖就近,只有在用到某个模块的时候再去require。看代码:
// AMD
define(['./a', './b'], function(a, b){ // 依赖必须一开始就写好
a.doSomething()
// 此处略去 100 行
b.doSomething()
...
});
// CMD
define(function(require, exports, mole){
var a = require('./a')
a.doSomething()
// 此处略去 100 行
var b = require('./b')
// 依赖可以就近书写
b.doSomething()
// ...
});
3、AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。
五:模块化进程五:ES6模块化
EcmaScript6标准增加了JavaScript语言层面的模块体系定义。ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS和AMD模块,都只能在运行时确定这些东西。
在 ES6 中,我们使用export关键字来导出模块,使用import关键字引用模块。需要说明的是,ES6的这套标准和目前的标准没有直接关系,目前也很少有JS引擎能直接支持。因此Babel的做法实际上是将不被支持的import翻译成目前已被支持的require。
尽管目前使用import和require的区别不大(本质上是一回事),但依然强烈推荐使用import关键字,因为一旦JS引擎能够解析ES6的import关键字,整个实现方式就会和目前发生比较大的变化。如果目前就开始使用import关键字,将来代码的改动会非常小。
示例:
import "jquery";
export functiondoStuff(){}
mole "localMole" {}
优点:
1、容易进行静态分析
2、面向未来的 EcmaScript 标准
缺点:
1、原生浏览器端还没有实现该标准
2、全新的命令字,新版的 Node.js才支持
Ⅲ 如何编译nodejs的二进制模块
god Buffer类是一个全局的直接处理二进制数据类型。它可以以各种方式构造。 look
sex 纯Javascript对于Unicode的处理是友好的,而对二进制并不友好。但处理TCP数据流和文件系统,必须要处理字节流,所以node.js提供一套策略来创建和操作字节流。 sex
googog 数据储存在一个Buffer实例中,一个Buffer的大小是固定的,类似于不可变的整数数组。 good
look Buffer与字符串之间的转换需要指定明确的编码。 googog
this Buffer支持的编码: book
yellow 'ascii'编码,只为7位的ASCII的数据。这个编码方法非常快! googog
god 'utf8' 编码,支持Unicode字符。 yellow
yellow 'utf16le' 编码,小端编码的Unicode字符。对(u10000 ~ u10FFFF)的支持。 fuck
book 'ucs2' 是 'utf16le' 编码的别名。 god
look 'base64' 是 Base64字符串编码。 this
good 'hex' 表示十六进制编码,每个byte编码为两个十六进制字符。 look
sex 一个Buffer对象也可以使用一个类型数组。Buffer对象克隆到一个ArrayBuffer,用作类型数组存储支持。node.js提供的Buffer和标准类型化数组是两套不同的系统,所以Buffer和ArrayBuffer的内存不共享。 sex
sex 注意:虽然V8提供了标准化的类型化数组,但node.js自身定义的Buffer提供了更灵活强大的API,在之后的章节会详细讲解两者的转换与使用方法。 good
Ⅳ JS用什么软件编译方便
编译JS的软件,我真的是不知道。
编辑JS的软件听说有好多,Eclipse不知道算不算。
Ⅳ nodejs内置模块有哪些
一、Express框架
前面的章节已经介绍过了,可以使用npm来安装node.js模块。具体操作请参照以前写的nodejs概论。
Express是一个nodejs的web开源框架,用于快速的搭建web项目。其主要集成了web的http服务器的创建、静态文本管理、服务器URL地址请求处理、get和post请求处理分发、session处理等功能。
使用方法,在cmd中打开你所想创建web项目的路径。然后输入
Express appname
即可创建一个名为appname的web项目。控制台打印结果
在jada文件中是可以使用for循环和if判断语句的,可以让你体会类似JSP的<%%>和php的<php></php>在网页上输出数据的快感。
三、forever模块
nodejs作为http服务器,需要确保服务顺利进行,要注意一下两点:
1.后台服务运行,监控运行日志,以及http运行日志;
2.确保项目的正常安全运行,Node.js的启动命令node,很大程度无法满足运行需求;
Node.js的forever模块在第二点就可以起到很大的作用,同时其拥有监控文件更改、自动重启等功能。
forever模块的使用方法有两种:1.在命令行中使用
forever -l forever.log -o out.log -e err.log app.js
-l forever.log -o out.log -e err.log分别指定了forever的运行日志,脚本流水日志,脚本运行错误日志,启动后将在本文件夹下产生out.log、err.log文件。
2.在编码中require forever模块使用。
四、Socket.IO模块
Socket.IO模块主要功能是将WebSocket协议应用到所有浏览器。主要用于实时的长连接多求情项目中。
例如:在线联网游戏,实时聊天、实时股票查看、二维码扫描登录等。
安装方法仍然是在cmd在中输入npm install socket.io
如何使用Socket.IO来创建一个项目。
需要分别实现服务端和客户端的逻辑:
先创建一个服务端的node.js脚本index_server.js
var app = require('http').createServer(handler)//创建服务器app
, io = require('socket.io').listen(app)//引用socket.io模块监听app
, fs = require('fs')//引用文件处理模块
app.listen(80);//指定app监听的端口,第二个参数127.0.0.1可省略
function handler (req, res) {
fs.readFile(__dirname + '/index.html', function (err, data) { if (err) {
res.writeHead(500); return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
其中,socket.emit()为Socket发送消息的函数,第一个参数表示发送消息的key值,第二个参数为发送消息的内容,也就是发送的数据。
Socket。on()为Socket接收消息的函数,第一个参数为接收消息的可以值,第二个参数为回调函数,其中回调函数携带的参数为接收消息所发送的数据。
接下来web前端如何使用JavaScrit 来连接Socket服务器。
新建一个index_client.html
<script type="text/javascript" src="socket.js"></script>
<script type="text/javascript"> var socket = io.connect('http://localhost');//创建本地sock连接
socket.on('news',function (data) {//Socket接收news消息时执行回调函数 console.log(data);
socket.emit('my other event',{my:'data'});
});</script>
<script type="text/javascript" src="socket.js"></script>加载已经安装好的Socket.io的本地JavaScrit文件。
var socket = io.connect('http://localhost');因为端口为80,所有这里可以不端口号
socket.on('news',function (data){}//客户端接收news消息成功后,发送my other event消息到服务端,发送的消息内容为json对象{my:'data'}
接下来只需要运行服务端的index_server.js文件来启动socket服务
效果:在浏览器输入http://127.0.0.1按F12调出浏览器的控制台console即可看见打印出了一个object对象。
执行完毕后可能会报错:catnot find mole socket.io,说明你的socket.IO没有安装,或已经安装并配置为全局,但你的安装路径并没有配置到在path中,所有无法引用。
你可以选择配置path,或者安装到项目内。这里建议安装到你的项目目录下,而不是简单粗暴的配置为全局。先卸载npm uninstall socket.io 进入指定目录后安装node index_server.js
socket.io详细请参阅 http://cnodejs.org/topic/50a1fcc7637ffa4155b5a264
五、request模块
request模块为开发者提供了一种简单访问HTTP请求的方法。request还支持HTTPS的访问方法。
安装:
npm install requset
request模块基本上覆盖了所有的HTTP请求方式如GET,POST,HEAD,DEL等。但其最基本的两个方法是request.get()和request.post().
get和post的区别
get:
1.使用get向服务器发出和接收的请求会附在url之后。类似:http://www..com?id=1221&name=5555这个url中传递了两个参数,一个为id,一个为name。
2.get请求不能超过1024个字节。
post没有限制,也不会附在url上。
接下来做一个简单的实例
get实例:
首先新建一个服务器app_get.js
var http= require("http");
http.createServer(function(req,res){
res.writeHead(200,{'content-Type':'text/plain'});
res.end('Hello world
'+req.method);
}).listen(1337,"127.0.0.1");
再建一个发送求情的request_get.js文件
var request=require('request');
request.get("http://127.0.0.1:1337",function(error,response,result){
console.log(result);
});
在CMD中运行app_get.js,运行成功后,再打开一个cmd(之前的cmd不要关闭),执行request_get.js文件。
执行后的结果如下
hello world
GET
可以看出,通过request.get方法访问
http://127.0.0.1:1337 返回的结果就是res.end()的参数
post实例:
和上面一样,先新建服务器app_post.js
var http= require("http"),
querystring=require('querystring');
http.createServer(function(req,res){ var postData=""; //开始异步接收客户端post的数据
req.addListener("data",function (postDataChunk) {
postData += postDataChunk;
}); //异步post数据接收完毕后执行匿名回调函数
req.addListener("end",function(){ var postStr=JSON.stringify(querystring.parse(postData));
res.writeHead(200,{'content-Type':'text/plain'});
res.end(postStr+'
'+req.method);
});
}).listen(1400,"127.0.0.1");
然后再新建一个request_post.js
var request=require("request");
request.post('http://127.0.0.1:1400',{form:{'name':'ermu','book':'node.js'}},function (error,response,result) {
console.log(result);
})
像上面一样在cmd中执行后显示的结果如下:
D:
odejssrc
equest>node request_post.js
{"name":"ermu","book":"node.js"}
POST
request post提交了一个json对象{"name":"ermu","book":"node.js"}而服务器接通过获取该POST数据,然后返回客户端,同时将http请求方式也响应到客户端。
request post参数可以有两种传递方式。
其中,第一种是将url和form表单的数据作为json参数在request post传递。举例如下:
request.post('url':'http://127.0.0.1:1400',form:{'name':'ermu','book':'node.js'}},function (error,response,result) {
console.log(result);
})
另一种是将url和form作为两个参数,上面的实例就是使用这种方法。
六、 Formidable模块
该模块的目的是为了解决文件上传。
在原生的node.js模块中,提供了获取post数据的方法,但是并没有直接获取上传文件。
Ⅵ js代码修改后,如何编译才能生效
js不需要编译啊,一般没有更新可能是缓存造成的,使用ctrl+f5强制刷新一下看看
Ⅶ require方法在js编译后被注释
RequireJS Optimizer 对脚本的优化支持目前流行的UglifyJS 和 Closure Compiler 两种压缩方式,UglifyJS 需要 NodeJS 环境支持,而Closure Compiler 则需要 Java 环境。这篇文章是以运行于 NodeJS 的 UglifyJS 来优化的,这也是RequireJS Optimizer 默认的压缩方法。
首先需要安装Node 0.4.0,然后下载r.js,下载好以后就可以在命令行里对前端代码进行优化了。r.js的参数传递使用方式,一是直接加在命令行后面,如下:
node r.js -o baseUrl=. paths.jquery=some/other/jquery name=main out=main-built.js
二是新建一个配置文件,例如 build.js(推荐使用这种方式),这样配置更方便,如下:
node r.js -o build.js
build.js 的配置代码如下:
{ baseUrl: "../js", dir: "../dist", optimize: "uglify", optimizeCss: "standard.keepLines", mainConfigFile: "../js/main.js", removeCombined: true, fileExclusionRegExp: /^./, moles: [
{ name: "app/dispatcher",
},
{ name: "app/in-storage", exclude: [ "jquery", "app/common", "pkg/DatePicker/app"
]
}
]
}
基本参数介绍
appDir
应用程序的最顶层目录。可选的,如果设置了的话,r.js会认为脚本在这个路径的子目录中,应用程序的文件都会被拷贝到输出目录(dir 定义的路径)。如果不设置,则使用下面的 baseUrl 路径。
baseUrl
默认情况下,所有的模块都是相对于这个路径的。如果没有设置,则模块的加载是相对于 build 文件所在的目录。另外,如果设置了appDir,那么 baseUrl 应该定义为相对于 appDir 的路径。
dir
输出目录的路径。如果不设置,则默认为和 build 文件同级的 build 目录。
optimize
JavaScript 代码优化方式。可设置的值:
- "uglify:使用UglifyJS 压缩代码,默认值;- "uglify2":使用2.1.2+ 版本进行压缩;- "closure": 使用Google's Closure Compiler 进行压缩合并,需要 Java 环境;- "closure.keepLines":使用Closure Compiler 进行压缩合并并保留换行;- "none":不做压缩合并;optimizeCss
CSS 代码优化方式,可选的值有:
- "standard":标准的压缩方式;mainConfigFile
如果不想重复定义的话,可以使用这个参数配置 RequireJS 的配置文件路径。
removeCombined
删除之前压缩合并的文件,默认值 false。
fileExclusionRegExp
要排除的文件的正则匹配的表达式。
moles
定义要被优化的模块数组。每一项是模块优化的配置,常用的几个参数如下:
- `name:`模块名;- `include:`额外引入的模块,`create:`如果不存在,是否创建。默认`false`;- `exclude:`要排除的模块。有些模块有公共的依赖模块,在合并的时候每个都会压缩进去,例如一些基础库。使用 exclude 就可以把这些模块在压缩在一个更早之前加载的模块中,其它模块不用重复引入。其它事项
RequireJS 配置也可以放到 RequireJS Optimizer配置文件里面,例如:
RequireJS Optimizer 的配置参数还有很多,完整的参数介绍可以看这里:
example.build.js
为方便运行,可以新建一个批处理文件:
注意事项:RequireJS Optimizer 只支持使用 require 和 define 语法定义的模块,因此下面这种通过变量定义的方式是不支持的:
而如果是这样定义则可以:
或者:
进一步优化
使用 r.js 优化后的代码可以使用almond来加载。almond 是一个轻量的 AMD 加载器,提供了最基础的 AMD API 实现以及模块加载功能。almond 只有不到 400 行代码,要比 RequireJS 小很多。可以使用 r.js 把 almond 一起合并到业务代码的前面,如下:
almond 特别适合使用 AMD 的网站或应用,但也有一些限制:
所有的模块编译为一个文件,没有动态的加载;
所有的模块都需要在 define() 定义 ID 和依赖,这个RequireJS Optimizer 会处理;
只能有一个requirejs.config() 或者 require.config() 调用;
不能使用 Require JS 多版本功能;
不能使用require.toUrl() 或者 require.nameToUrl();
不能使用packages/packagePaths 配置。
如果你的项目中没有这些问题的话,可以放心使用 almond 进行加载。
Ⅷ js编译器
DW好像也有提示吧!是最新版本的。。CS4
我的是用的JS库,JQUERY的一个插件,,带提示的。。