【NodeJS】归纳篇(二)模块化

167 阅读3分钟
原文链接: blog.csdn.net

模块化方案简介

首先我们先介绍下模块化: Js主要有四种模块化方案:

  • AMD : requireJs
  • CMD : seaJs
  • nodejs 语言自身所带的模块化require/exports/module
  • ES 6 官方的 export/import

剖析seaJs模块化原理

下面,先来剖析下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;
	});

NodeJs模块

node中的模块,如:

  • 系统模块:http、querystring、url…
  • 自定义模块
  • 包(模块)管理

下面进行介绍:

系统模块

手册: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

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,一个东西

(2) npm:nodejs Package Manage Nodejs包管理器

npm install mysql 
npm unstall mysql

例如将自定义模块myMod.js放置到node_modules中,引用时就可以不用加 ./

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中的版本号,需谨慎!

此次,模块化就介绍到这里。

这里写图片描述