上海做网站优化公司,推广普通话奋进新征程宣传标语,定西谁做网站,莱芜网站优化费用3.Node 加载
Node 对 ES6 模块的处理比较麻烦#xff0c;因为它有自己的 CommonJS 模块格式#xff0c;与 ES6 模块格式是不兼容的。目前的解决方案是#xff0c;将两者分开#xff0c;ES6 模块和 CommonJS 采用各自的加载方案
3.1在静态分析阶段#xff0c;一个模块脚本…3.Node 加载
Node 对 ES6 模块的处理比较麻烦因为它有自己的 CommonJS 模块格式与 ES6 模块格式是不兼容的。目前的解决方案是将两者分开ES6 模块和 CommonJS 采用各自的加载方案
3.1在静态分析阶段一个模块脚本只要有一行import或export语句Node 就会认为该脚本为 ES6 模块否则就为 CommonJS 模块。如果不输出任何接口但是希望被 Node 认为是 ES6 模块可以在脚本中加一行语句 上面的命令并不是输出一个空对象而是不输出任何接口的 ES6 标准写法
3.2import 命令加载 CommonJS 模块
Node 采用 CommonJS 模块格式模块的输出都定义在module.exports这个属性上面。在 Node 环境中使用import命令加载 CommonJS 模块Node 会自动将module.exports属性当作模块的默认输出即等同于export default import命令加载上面的模块module.exports会被视为默认输出
如果采用整体输入的写法import * as xxx from someModuledefault会取代module.exports作为输入的接口直接赋予在对象上成为属性** 上面代码中需要注意的是整体的输出Node 会自动为baz添加default属性通过baz.default才能拿到module.exports bar本身是一个对象不能当作函数调用只能通过bar.default调用
CommonJS 模块的输出缓存机制在 ES6 加载方式下依然有效 即CommonJS输出缓存的机制导致即使通过import加载了foo.js文件得到的结果依然是缓存里的123
由于 ES6 模块是编译时通过export确定输出接口而CommonJS 模块是运行时确定输出接口所以采用import命令加载 CommonJS 模块时不允许采用下面的写法(不要添加大括号因为等价于输出的是export default) 上面的写法不正确因为fs的书写是 CommonJS 格式的只有在运行时才能确定readfile接口而import命令要求编译时就确定这个接口。解决方法就是改为整体输入 这里的’express’就没有出现大括号的形式
3.3require 命令加载 ES6 模块
采用require命令加载 ES6 模块时ES6 模块的所有输出接口会成为输入对象的属性
上面代码中ES6模块的default接口变成了通过require产生的es_namespace.default对象的属性。另外由于CommonJS的输出缓存机制所以es.js在已经输出foo后再对foo的重新赋值没有在模块外部反映出来