package.json中的type字段含义
如果最近的package.json文件包含一个顶级字段“type”,其值为“module”,则以.js结尾或没有任何扩展名的文件将作为ES模块进行加载。
如果最近的package.json缺少“type”字段,或者包含“type”:“commonjs”,则无扩展名的文件和.js结尾文件将被视为commonjs。如果一直到卷根,还是没找到package.json, Node.js则按默认规则运行,就像package.json中没有“type”字段。“无扩展”指的是不包含扩展名的文件路径,而不是在说明符中选择性地删除文件扩展名。
不管“type”字段的值是多少,.mjs文件总是被当作ES模块,而.cjs文件总是被当作CommonJS。
总的来说,关于type,知道下面4点就行了:
type
字段的产生用于定义package.json
文件和该文件所在目录根目录中.js
文件和无拓展名文件的处理方式。值为'moduel'
则当作es模块处理;值为'commonjs'
则被当作commonJs模块处理- 目前node默认的是如果
pacakage.json
没有定义type
字段,则按照commonJs规范处理 - node官方建议包的开发者明确指定
package.json
中type
字段的值 - 无论
package.json
中的type
字段为何值,.mjs
的文件都按照es模块来处理,.cjs
的文件都按照commonJs模块来处理
commonjs与ES6的module还是有很大区别的:
- 两者的模块导入导出语法不同:commonjs是module.exports,exports导出,require导入;ES6则是export导出,import导入。
- commonjs是运行时加载模块,ES6是在静态编译期间就确定模块的依赖。
- ES6在编译期间会将所有import提升到顶部,commonjs不会提升require。
- commonjs导出的是一个值拷贝,会对加载结果进行缓存,一旦内部再修改这个值,则不会同步到外部。ES6是导出的一个引用,内部修改可以同步到外部。
- 两者的循环导入的实现原理不同,commonjs是当模块遇到循环加载时,返回的是当前已经执行的部分的值,而不是代码全部执行后的值,两者可能会有差异。所以,输入变量的时候,必须非常小心。ES6 模块是动态引用,如果使用
import
从一个模块加载变量(即import foo from 'foo'
),那些变量不会被缓存,而是成为一个指向被加载模块的引用,需要开发者自己保证,真正取值的时候能够取到值。 - commonjs中顶层的this指向这个模块本身,而ES6中顶层this指向undefined。
- CommonJs 是单个值导出,ES6 Module可以导出多个
- 然后就是commonjs中的一些顶层变量在ES6中不再存在:
arguments
require
module
exports
__filename
标签:ES6,commonjs,package,json,模块,type From: https://www.cnblogs.com/zccst/p/17067676.html