首页 > 其他分享 >package.json中的type字段含义,及commonjs与ES6的区别

package.json中的type字段含义,及commonjs与ES6的区别

时间:2023-01-26 12:00:36浏览次数:53  
标签:ES6 commonjs package json 模块 type

 

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点就行了:

  1. type字段的产生用于定义package.json文件和该文件所在目录根目录中.js文件和无拓展名文件的处理方式。值为'moduel'则当作es模块处理;值为'commonjs'则被当作commonJs模块处理
  2. 目前node默认的是如果pacakage.json没有定义type字段,则按照commonJs规范处理
  3. node官方建议包的开发者明确指定package.jsontype字段的值
  4. 无论package.json中的type字段为何值,.mjs的文件都按照es模块来处理,.cjs的文件都按照commonJs模块来处理

 

 

commonjs与ES6的module还是有很大区别的:

  1. 两者的模块导入导出语法不同:commonjs是module.exports,exports导出,require导入;ES6则是export导出,import导入。
  2. commonjs是运行时加载模块,ES6是在静态编译期间就确定模块的依赖。
  3. ES6在编译期间会将所有import提升到顶部,commonjs不会提升require。
  4. commonjs导出的是一个值拷贝,会对加载结果进行缓存,一旦内部再修改这个值,则不会同步到外部。ES6是导出的一个引用,内部修改可以同步到外部。
  5. 两者的循环导入的实现原理不同,commonjs是当模块遇到循环加载时,返回的是当前已经执行的部分的值,而不是代码全部执行后的值,两者可能会有差异。所以,输入变量的时候,必须非常小心。ES6 模块是动态引用,如果使用import从一个模块加载变量(即import foo from 'foo'),那些变量不会被缓存,而是成为一个指向被加载模块的引用,需要开发者自己保证,真正取值的时候能够取到值。
  6. commonjs中顶层的this指向这个模块本身,而ES6中顶层this指向undefined。
  7. CommonJs 是单个值导出,ES6 Module可以导出多个
  8. 然后就是commonjs中的一些顶层变量在ES6中不再存在:
arguments
require
module
exports
__filename

 

标签:ES6,commonjs,package,json,模块,type
From: https://www.cnblogs.com/zccst/p/17067676.html

相关文章

  • 理解es6 Promise的resolve和reject方法
    es6Promise.resolve()方法有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用。constjsPromise=Promise.resolve($.ajax('/whatever.json'));......
  • ES6的Promise用法
    一、是什么:promise是异步编程的一种解决方案,它是一个对象,可以获取异步操作的信息,它的出现改善了异步编程,避免了地狱回调,它比传统的解决方案回调函数和事件更合理和更......
  • ES6-Promise与Class类
    一。Promise作用transitionend是过渡结束事件,只要过渡结束就会触发;回调地狱: ......
  • vue.js客服系统实时聊天项目开发(七)ES6模板字符串进行字符串变量内嵌拼接
    在开发客服系统的时候进行字符串拼接的太多,可以使用模板字符串处理你可以使用ES6中的模板字符串来实现这个功能。模板字符串是用反引号(`)括起来的字符串,其中变量可以使用${......
  • windows powershell运行ps1提示缺少某些package或driver
    在做自动化的时候我们用windowspowershell(命令:powershell绝对路径)运行ps1报错如下但是如果先进入powershell然后cd到ps1所在路径下运行ps1则不会报错\\如何解决:......
  • (转发) Fix the upstream dependency conflict installing NPM packages
    原文:FixtheupstreamdependencyconflictinstallingNPMpackages|bobbyhadz FixtheupstreamdependencyconflictinstallingNPMpackages #Usethe --lega......
  • ES6-新增方法
    一。字符串的includes方法:   应用:   //将网址加上后面的键值//https://www.imooc.com/course/list//https://www.imooc.com/......
  • 【ES6】正则表达式的拓展
    【ES6】正则表达式的拓展​​一、什么是正则表达式​​​​二、正则表达式常用技术介绍​​​​1)正则表达式的写法​​​​I.修饰符​​​​II.匹配模式​​​​2)正则表达......
  • 【ES6】变量的解构赋值
    【ES6】变量的解构赋值​​一、什么叫解构赋值?​​​​二、解构赋值有哪些分类?写法?​​​​1)对数组的解构赋值​​​​2)对对象的解构赋值​​​​3)对字符串的解构赋值​......
  • 【ES6】字符串的拓展
    【ES6】字符串的拓展​​一、为什么ES6要进行字符拓展?​​​​二、ASCLL码、Unicode编码、UTF-8编码的异同​​​​三、ES6新增的字符串接口​​​​1)codePointAt()​​​​......