模块化方案简介
首先我们先介绍下模块化: Js主要有四种模块化方案:
下面,先来剖析下seaJs中的模块化原理,用代码说明:
//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;
});node中的模块,如:
下面进行介绍:
手册:http://nodejs.cn/api/
//明白3个词
//require : 请求:引入模块的
//module : 模块: 批量输出
//exports : 对外一个一个输出usemyMod.js
const mod1 = require('./myMod.js');
//.js可省略,注意自定义模块的路径,引入自定义模块加 ./
console.log(mod1.a);myMod.js
对外输出东西,需要加给exports,用处控制哪些输出 注意,nodejs中没有全局变量,每个定义的变量只能在模块内使用,除非你exports这个变量。nodejs会自动将模块包裹在:
(function(){
})();
exports.a =12;但是,对外输出一堆东西时呢?难道这样写吗?
exports.a = 12;
exports.b = 10;
exports.c = 5;这样就不太好看了。。 这时候就可以用到module module 能用于帮助批量输出东西。
module.exports = {a:12,b:10,c:5};注意:
module.exports == exports //true,一个东西npm install mysql
npm unstall mysql例如将自定义模块myMod.js放置到node_modules中,引用时就可以不用加 ./
const mod1 = require('myMod');所以,require引入步骤是这样:
1、如果有"./“,从当前目录找 2、如果没有”./",先从系统模块找,找不到,再从node_modules找,因为系统模块的优先级更高
故,约定一下,自定义模块都放在 node_modules文件夹中。
npm login输入用户名和密码及邮箱npm init初始化包信息,输入包名(name),版本(version),描述(description),及主文件(入口地址,默认index.js)等等,结束后会生成一个结构npm publish发布注意,如果当前版本改动之后需要再次上传至npm ,需要先修改package.json里面的version版本号,然后再进行npm publish
在其他项目中如果有引用到,只需进行一次npm update [moduleName更新的包名]
npm --force unpublish强制删除当前package.json中的版本号,需谨慎!此次,模块化就介绍到这里。