Node.js中每个模块都是一个独立构造函数,解释器会为每个.js文件添加如下代码:
(function(exports,require, module, __filename, __dirname){
//exports:本质是一个空对象{ } 用于声明向外部导出的自己的成员
//require:本质是一个函数fn 用于导入其它的模块,创建指定模块对象
//module:
//__filename:
//__dirname:
//自己编写的文件内容
})
//module_user.js
//(function(export,require,module,__filename,__dirname){var userCount = 998;
var userLogin = function(){
console.log("User login...");
}var userLogout = function(){
console.log("User logout...");
}//向外公开自己内部的文件
exports.uCount = userCount;
exports.uLogin = userLogin;
exports.uLogout = userLogout;
//})
//app.js
var moduleUser = require("./module_user.js");
//引入另外一个模块js后缀可以省略
/**
* Node.js中每个模块都是一个module对象
* */
//使用module_user.js中的成员
console.log(moduleUser);
console.log(moduleUser.uCount);
console.log(moduleUser.uLogin);
moduleUser.uLogout();
//只能使用module_user.js自己exports的成员
每个模块都可以使用自己的require()函数引入另一个模块——底层本质就是创建了指定模块的一个对象实例。
require('./模块文件名')
每个模块可以使用exports对象向外导出/公开一些自己内部的成员供其它模块使用。
exports.成员名 =成员值;
Node.js的模块中exports和module.exports对象的区别是什么? 二者都可以用于向外界导出自己内部的成员。但: module变量指代当前模块对象,真正导出的是modue.exports; Node.js底层有代码: exports = module.exports。 所以:若只是给exports对象添加新的成员,则等价于给module.exports添加新成员; 但是若修改了exports的指向,则不会产生实质的作用,即exports指向了一个新的对象,不再与module.exports指向同一个对象,例如 exports = { size:getSize; }; 声明并不起作用。 但是module.exports = { sum:function(){}, avg:avg }; 可以用对象声明,不会影响结果。 导出单独的方法用exports: exports.get=function(){console.log('获取数据')} 导出一个对象用module.exports module.exports = obj; |
仿写nodejs的URL模块:
/**_URLjs
* 接收一个URL字符串,解析出各个部分
* @param path 要解析的URL字符串,形如: http://www.jd.com:80/ad/index.html?name=gemini&pwd=123
* @returns {{}包含解析出各个部分的对象}
*/function parse(path){
var result = {};
var i1 = path.indexOf('://');
result.protocol = path.substring(0,i1);
var i2 = path.lastIndexOf(':');
//i2是:最后一次出现的下标位置
result.hostname = path.substring(i1+3,i2);
var i3 = path.indexOf('/',i2);
//最后一个:后面的第一个/的下标位置
path = path.substring(i3);
result.path = path;
var i4 = path.indexOf('?');
result.queryString = path.substring(i4+1);
result.query = {};
var list = result.queryString.split('&');
//['name=gemini','pwd=123']
for(var v of list){
var prop = v.split('=');
//v[0]:['name','gemini'];
v[1]:['pwd','123']
result.query[prop[0]] = prop[1];
}
return result;
}
//向外部导出自己内部的成员
module.exports.parse = parse;
主程序模块app.js
const util = require('util');
//加载node.js官方提供的原生模块,不需要加路径
const moduleUrl = require("./_URL");
//const 避免修改模块的内容
var p ='http://www.jd.com:80/ad/index.html?name=gemini&pwd=123';
var obj = moduleUrl.parse(p);
console.dir(obj);
var str = util.inspect(obj);
console.log(str);
1.自定义模块的两种形式
(1)文件模块
【node|node.js学习笔记-模块module】创建一个js文件,如m3.js,导出需要公开的数据。其它模块可以require('./m3')模块
(2)目录模块
方式1:必须使用index.js命名模块
创建一个目录,假设名为m4,其中创建名为index.js的文件,导出需要公开的数据。其它模块可以require('./m4')模块
方式2:必须在目录中新建package.json文件并在其中配置参数:"main": "./文件名.js"
创建一个目录,假设名为m5,其中创建package.json文件,其中声明main属性指定默认执行的启动JS文件,如5.js,其中导出需要公开的数据。其它模块可以require('./m5')模块
{
"name": "application-name",
"version": "0.0.1",
"main":"5.js"
}
方式3:必须将目录放在node_modules根目录中并配置main参数
创建一个目录,必须名为node_modules,其中再创建目录模块,假设名为m6,其中创建package.json文件,其中声明main属性指定默认执行的启动JS文件,如6.js,其中导出需要公开的数据。其它模块可以require('m6')模块
练习:
1.创建自定义模块:
文章图片
2. 配置package.json
{
"name": "rectangle",
"version": "1.0",
"main": "./index.js"
}
3. 在主程序中使用
app.js
const circle = require("circle");
console.log(circle.perimeter(3));
const rectangle = require("rectangle");
console.log("rectangle's size is "+rectangle.size(2,7));
推荐阅读
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- 前端|web前端dya07--ES6高级语法的转化&render&vue与webpack&export
- JS/JavaScript|JS/JavaScript CRC8多项式 16进制
- JS|VUE学习笔记[30-46]
- 腾讯TEG实习|腾讯实习——Vue解决跨域请求
- 地图|高德地图清除指定覆盖物 自定义覆盖物样式(完整dome)
- Pyecharts|Pyecharts 猎聘招聘数据可视化
- flex|C语言-使用goto语句从循环中跳出
- HTML+Js实战项目|在网页中实现icon小图标的几种方法
- js中国标准时间转化为年月日,时间戳