一直有个疑问,写东西有时候总要在import和require之间来回切换,好难受,为什么没人或组织把这两个统一一下呢?只用import或只用require。。。
一直有个疑问,写东西有时候总要在import和require之间来回切换,好难受,为什么没人或组织把这两个统一一下呢?只用import或只用require。。。
因为 CommonJS
不是一个规范,在 ES modules
出现之前,其实没有一个可按需导入的单独模块的机制/标准。
从 CommonJS
的介绍里面也可以看到这个问题:
这个项目由 Mozilla 工程师 Kevin Dangoor 于2009年1月发起,最初名为
ServerJS
。在2009年8月,这个项目被改名为 “CommonJS
” 来展示其API的广泛的应用性。有关规定在一个开放进程中被创建和认可,一个规定只有在已经被多个实现完成之后才被认为是最终的。CommonJS
不隶属于致力于ECMAScript的Ecma国际的工作组TC39
,但是TC39
的一些成员参与了这个项目。The project was started by Mozilla engineer Kevin Dangoor in January, 2009 and initially named
ServerJS
.
In August 2009, the project was renamedCommonJS
to show the broader applicability of the APIs. Specifications are created and approved in an open process. A specification is only considered final after it has been finished by multiple implementations.CommonJS
is not affiliated with the Ecma International groupTC39
working on ECMAScript, but some members ofTC39
participate in the project.
可以把 CommonJS
理解为行内认可的一个非官方标准。 ESM
才是官方的标准,但是因为 ESM
出现的实在太晚了,已经有非常的项目使用了 Commonjs
去实现包的模块化,所以这种沉重的历史包袱才出现 CJS
和 ESM
共存的这种尾大不掉的现状。
8 回答5.8k 阅读✓ 已解决
9 回答9.1k 阅读
6 回答4.7k 阅读✓ 已解决
5 回答3.5k 阅读✓ 已解决
4 回答7.9k 阅读✓ 已解决
7 回答9.7k 阅读
5 回答7.1k 阅读✓ 已解决
这个问题涉及到 JavaScript 的模块化机制的发展历程和目前的现状。在早期的 JavaScript 版本中,没有标准的模块化机制,使用 script 标签引入不同的 JavaScript 文件来完成代码组织和管理。后来,CommonJS 提出了一种基于 require() 和 module.exports 的模块化规范,该规范被 Node.js 和许多前端构建工具广泛应用。在 CommonJS 规范中,使用 require() 导入模块,使用 module.exports 导出模块。
随着 ES6 的发布,JavaScript 标准化组织提出了一种新的模块化机制,即 ES6 模块化。在 ES6 模块化中,使用 import 导入模块,使用 export 导出模块。由于浏览器和 Node.js 都对 ES6 模块化有所支持,因此越来越多的 JavaScript 项目开始采用 ES6 模块化规范,而不再是 CommonJS 规范。
因此,现在的 JavaScript 项目可能会同时使用 import 和 require(),以便在 Node.js 环境和浏览器环境中都能正常运行。尽管这样会让代码显得有些混乱,但由于历史原因和现实需求,暂时没有一个完全统一的模块化机制。
另外,一些 JavaScript 构建工具,如 Webpack 和 Rollup,提供了一种类似于 ES6 模块化的语法(如 import 和 export),但实际上会将这些语法转换为 CommonJS 规范的代码。因此,在使用这些构建工具时,仍然需要使用 require() 和 module.exports。