⭐️ 本文首发自 前端修罗场(点击加入),是
一个由 资深开发者 独立运行 的专业技术社区
,我专注Web 技术、Web3、区块链、答疑解惑、面试辅导以及职业发展
。博主创作的 《前端面试复习笔记》(点击订阅),广受好评,已帮助多人提升实力、拿到 offer。现在订阅,私聊我即可获取一次免费的模拟面试机会
,帮你评估知识点的掌握程度,获得更全面的学习指导意见!
首先我们先介绍下模块化:
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,一个东西
提供统一的下载途径,如在软件管家中下载软件
自动下载依赖,就像平时使用某些软件时需要.net framework4.5这样的依赖
node_modules文件夹: 放置已下载的模块和自定义模块
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中的版本号,需谨慎!此次,模块化就介绍到这里。