一直有个疑问?在js中为什么不把import和require统一了?

一直有个疑问,写东西有时候总要在import和require之间来回切换,好难受,为什么没人或组织把这两个统一一下呢?只用import或只用require。。。

阅读 2.3k
2 个回答

这个问题涉及到 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。

因为 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 renamed CommonJS 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 group TC39 working on ECMAScript, but some members of TC39 participate in the project.

可以把 CommonJS 理解为行内认可的一个非官方标准。 ESM 才是官方的标准,但是因为 ESM 出现的实在太晚了,已经有非常的项目使用了 Commonjs 去实现包的模块化,所以这种沉重的历史包袱才出现 CJSESM 共存的这种尾大不掉的现状。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏