模块化方案简介
首先我们先介绍下模块化: Js主要有四种模块化方案:
- AMD : requireJs
- CMD : seaJs
- nodejs 语言自身所带的模块化require/exports/module
- ES 6 官方的 export/import
剖析seaJs模块化原理
下面,先来剖析下seaJs中的模块化原理,用代码说明:
代码语言:javascript复制//1、在js文件里(模块里)
define(function(require,exports,module){
reqiuire('mod2.js');
});
//2.在html文件里
seajs.use('lib/mod1.js',function(mod){})
//3.my-sea.js
const sea = {
use(path,fn_end) {
$.ajax({
url:path,
success(str){
parseStr(str,fn_end);
function parseStr(str,fn_end){
function define(fn){
let module= {
exports:{}
};
fn(function(){},module.exports,module);
fn_end(module.exports);
}
//第一步:把require都找出来
let str = fn.toString();
str = str.substring(str.indexOf('{') 1,str.lastIndexOf('}'));
str = str.match(/require([^()] )/g); //找出require
str.map(item=>{
//item.substring(item.search(/"|'));
if(item.indexOf('""')!=-1){
return item.substring(item.indexOf(""") 1,item.lastIndexOf("""));
}else {
return item.substring(item.indexOf("'") 1,item.lastIndexOf("'"));
}
});
//递归
let i = 0;
let json ={};
function next(){
$.ajax({
url:arr[i],
success(str){
parseStr(str,function(mod){
json[arr[i]] = mod;
i ;
if(i==arr.length){
//第二部:执行代码
str.replace('require(xxx)',)
eval(str);
}
else{
next();
}
})
}
})
}
}
},
error(){}
})
}
}
//4.lib/mod1.js
define(function(fn){
let mod2 = require('mod2.js');
let mod3 = require('mod3.js');
exports.result = mod2.num1 mod3.num2;
});
//5. lib/mod2.js
define(function(fn){
exports.num1= 12;
});
//6. lib/mod3.js
define(function(fn){
exports.num2= 2;
});
NodeJs模块
node中的模块,如:
- 系统模块:http、querystring、url…
- 自定义模块
- 包(模块)管理
下面进行介绍:
系统模块
手册:http://nodejs.cn/api/
- 断言:简单理解,即在应用程序中应该出现的情况,如果没有,那么这个程序就崩了。这用于帮助测试。
- Buffer
- …
- crypto - 加密,如md5
- DNS 解析域名 ,如 dns.getServers()找IP
- Domain 已废弃
- Events 模拟事件
- Net 网络操作,如发送邮件
- OS 提供与操作系统相关的操作
- Path 处理文件路径,如返回目录名字,文件名,扩展名…
- stream 流操作,如读取文件返回客户端,可以读一点发一点,这与readFile进行区分,readFile是整个文件读取
- timer 定时器,与setInterval、setTimeout没有区别
- util 工具性东西
- zlib 压缩,如将用户上传的文件进行压缩
自定义模块
(1)写一个自己的模块:
- 模块组成
- npm
- 发布模块
//明白3个词
//require : 请求:引入模块的
//module : 模块: 批量输出
//exports : 对外一个一个输出
usemyMod.js
代码语言:javascript复制const mod1 = require('./myMod.js');
//.js可省略,注意自定义模块的路径,引入自定义模块加 ./
console.log(mod1.a);
myMod.js
对外输出东西,需要加给exports,用处控制哪些输出 注意,nodejs中没有全局变量,每个定义的变量只能在模块内使用,除非你exports这个变量。nodejs会自动将模块包裹在:
代码语言:javascript复制(function(){
})();
exports.a =12;
但是,对外输出一堆东西时呢?难道这样写吗?
代码语言:javascript复制exports.a = 12;
exports.b = 10;
exports.c = 5;
这样就不太好看了。。 这时候就可以用到module module 能用于帮助批量输出东西。
代码语言:javascript复制module.exports = {a:12,b:10,c:5};
注意:
代码语言:javascript复制 module.exports == exports //true,一个东西
(2) npm:nodejs Package Manage Nodejs包管理器
- 提供统一的下载途径,如在软件管家中下载软件
- 自动下载依赖,就像平时使用某些软件时需要.net framework4.5这样的依赖
- node_modules文件夹: 放置已下载的模块和自定义模块
npm install mysql
npm unstall mysql
例如将自定义模块myMod.js放置到node_modules中,引用时就可以不用加 ./
代码语言:javascript复制const mod1 = require('myMod');
所以,require引入步骤是这样:
1、如果有"./“,从当前目录找 2、如果没有”./",先从系统模块找,找不到,再从node_modules找,因为系统模块的优先级更高
故,约定一下,自定义模块都放在 node_modules文件夹中。
(3) 将自己的模块上传,给别人用
- 先注册,有一个npm账号
- 然后在命令行中,登陆你的账号
npm login
输入用户名和密码及邮箱 - 登陆成功
npm init
初始化包信息,输入包名(name),版本(version),描述(description),及主文件(入口地址,默认index.js)等等,结束后会生成一个结构- 确认后,在目录下生成package.json
npm publish
发布
注意,如果当前版本改动之后需要再次上传至npm ,需要先修改package.json里面的version版本号,然后再进行npm publish
在其他项目中如果有引用到,只需进行一次npm update [moduleName更新的包名]
npm --force unpublish
强制删除当前package.json中的版本号,需谨慎!
此次,模块化就介绍到这里。