模块引入
模块引入是node一个重要的知识点
导出方式:
方式1:
module.exports={
userName:'Jack',
sayHello:function(){
return this.userName
}
}
方式二:
exports.userName= 'Jack'
exports.sayHello=function(){
return this.userName
}
引入方式
let userblog = require('./User.js')
console.log(userblog.userName) //Jack
userblog.sayHello()
这两种引入方式有什么区别呢?、
我们已知,node在编译js文件的时候,都会吧代码包在这里面,这样避免了代码中变量作用域问题
(function (exports,require,module,__filename,__direname)){
//do something
})
exports:该对象用来将函数的内部局部变量或局部函数暴露到外部
require:用来引入外部变量
module:代表当前模块本身,exports就是模块的属性(即一个变量赋值:exports = module.exports
),所以可以使用exports
或者module.export
导出
__filename:当前模块的完整路经
__direnam:当前模块所在文件夹的完整路径
当我们想要一次性导出一大堆东西出来的时候(应该使用上面方式一的方式)
不能这样子
exports={
userName:'Jack',
}
这样在另一个文件require出来的东西是{}
因为require出来的东西是是来自引入文件的module.exports
,exports={}
这个操作切断了exports
和module.export
的联系(因为他们应该指向同一个内存地址)
这个就是第一点区别:exports只能通过点语法,但是module.exports
既能通过点语法,也能通过=赋值语法
第二点区别:
module.export
可以export构造函数,但是exports
不能
function Person(name, sex) {
this.name = name
this.sex = sex
}
Person.prototype.say = function () {
console.log(this.name)
}
exports.Person = Person
//require文件
var person = require(...)
var p = new Person()
//报错,Person is not a constructor
总结!模块导出都用module.exports
模块引入过程
路径分析
文件定位
编译执行
路径分析,即是require(),内部接受一个模块标识符,又可分为
核心模块标识符:类似于这些模块http,fs,path
路径形式的模块标识符,速度仅次于核心模块
非以上两种的其他形式,速度最慢。加载过程逐个尝试模块路径
文件定位:
扩展名分析:js,json,node进行比对,查找确定文件。其过程需要fs模块同步阻塞式判断文件是否存在。所以建议加上文件后缀比较好,尤其是node和json文件
引入后进行缓存
node缓存,不同于浏览器缓存缓存静态脚本,提高加载速度
node对编译和执行之后的对象进行缓存
踩坑:
同一个文件中,不要同时是用es6和common.js引入/导出语法。否则报错
Cannot assign to read only property 'exports' of object '#<Object>'
导出最好使用module.exports
语法