模块引入

2019-11-20  本文已影响0人  haha2333

模块引入是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.exportsexports={}这个操作切断了exportsmodule.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语法

上一篇下一篇

猜你喜欢

热点阅读