欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS文件导入导出

程序员文章站 2024-02-20 19:54:16
...

CommonJS

CommJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。

var x = 5;
var addX = function (value) {
	return value + x;
};
module.exports.x = x;
module.exports.addX = addX;

//导入
var example = require('./example.js');
console.log(example.x); // 5
console.log(example.addX(1)); // 6



exports.area = function (r) {
  return Math.PI * r * r;
};
exports.circumference = function (r) {
  return 2 * Math.PI * r;
};
注意,不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系。
  1. 所有代码都运行在模块作用域,不会污染全局作用域。
  2. 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次 运行,必须清除缓存。
  3. 模块加载的顺序,按照其在代码中出现的顺序。

AMD

CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD规范则是非同步加载模块,允许指定回调函数。由于Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用。但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用AMD规范。

require

** 如果模块输出的是一个函数,那就不能定义在exports对象上面,而要定义在module.exports变量上面。**

module.exports = function () {
console.log(“hello world”)
}

require(’./example2.js’)()
上面代码中,require命令调用自身,等于是执行module.exports,因此会输出 hello world。

  1. 模块的缓存
    第一次加载某个模块时,Node会缓存该模块。以后再加载该模块,就直接从缓存取出该模块的module.exports属性。
    require(’./example.js’);
    require(’./example.js’).message = “hello”;
    require(’./example.js’).message
    // “hello”
    上面代码中,连续三次使用require命令,加载同一个模块。第二次加载的时候,为输出的对象添加了一个message属性。但是第三次加载的时候,这个message属性依然存在,这就证明require命令并没有重新加载模块文件,而是输出了缓存。
    如果想要多次执行某个模块,可以让该模块输出一个函数,然后每次require这个模块的时候,重新执行一下输出的函数。
    所有缓存的模块保存在require.cache之中,如果想删除模块的缓存,可以像下面这样写。
    // 删除指定模块的缓存
    delete require.cache[moduleName];
    // 删除所有模块的缓存
    Object.keys(require.cache).forEach(function(key) {
    delete require.cache[key];
    })
    注意,缓存是根据绝对路径识别模块的,如果同样的模块名,但是保存在不同的路径,require命令还是会重新加载该模块。
相关标签: commjs