Daniel Hernández 上面指出的差异更多地与模块的使用方式和 Javascript 作为一种语言的特殊性有关,而不是与使用的模块系统本身有关。还有声明CommonJS cuando cargas un módulo te trae una copia del módulo para que lo puedas usar, mientras que ES2015 trae una referencia a ese módulo.这是完全错误的。有关它的更多信息,请参阅官方 Nodejs 文档。require 仅返回对加载到 Node 模块缓存中的模块的引用。import 支持存在指向其他模块中对象的局部符号,而 require 只支持指向整个模块。因此,创建引用另一个模块中的变量的局部符号必须经过分配新局部变量的过程。鉴于 Javascript 的性质,如果重新分配这个局部变量,它只会改变它指向的位置,因此模块中需要初始值的变量不会被修改。
例子:
// aquí x no es una variable local sino un símbolo, no puede ser reasignado por definición debido a la nueva sintaxis
import {x} from 'x';
// aquí y es una variable definida localmente que puede sufrir modificaciones
var y = require('x').x;
// aquí la variable local y se ha reasignado para que referencie el valor 35.
y = 35;
上面的例子并不意味着不能在本地代码中修改从模块 x 导出的变量 x。但是当使用局部变量时,我们正在修改的是这个变量。以下示例使用 CommonJS 模块系统修改模块 x 中的变量 x。
在 Node.js 中创建了一个名为 CommonJS 的模块系统,它用于: const module = require('module'); 在 ES2015/6 中,使用以下语法将本机模块系统添加到语言中: import module from 'module'; 尽管它们基本上看起来做同样的事情,但实际上它们在较低级别上的工作方式不同。
CommonJS 在加载模块时会为您提供模块的副本,以便您可以使用它,而 ES2015 则为该模块带来引用。这意味着,如果您的模块有一个变量并且您导出了一个修改该变量的函数,那么使用该变量的应用程序的任何其他部分都将看到反映的更改,而使用 CommonJS,每个人都将拥有自己的变量副本。 .
你可以在这里阅读更好更完整的解释
import 和 require 之间的区别是巨大的。
一方面 require 是执行环境引入的全局函数,而 import 是添加到语言中的新语法。由于 require 是一个与其他函数一样的函数,因此可以在代码中的任何位置调用它。从而允许动态加载模块。这取决于您如何使用它,这可能是好是坏,但是正确地使用它可以使应用程序启动得更快。另一方面,导入只是语法,因此不能分配给变量,因此模块加载是静态定义的。这一秒也可能是坏的或好的,这取决于你如何看待它。一方面,由于模块之间的关系是静态的,因此无需执行代码就可以对其进行分析,这样可以提供更好的开发工具,另一方面,它也有非常死板的缺点。
为了说明差异,让我们以 sequelize 库作为案例研究。该库提供了将 javascript 模块作为模型导入的可能性。这是可能的,因为 require 是一个和其他函数一样的函数,它的参数可以是任何值。这不能以使用导入的相同方式完成。
Daniel Hernández 上面指出的差异更多地与模块的使用方式和 Javascript 作为一种语言的特殊性有关,而不是与使用的模块系统本身有关。还有声明
CommonJS cuando cargas un módulo te trae una copia del módulo para que lo puedas usar, mientras que ES2015 trae una referencia a ese módulo.
这是完全错误的。有关它的更多信息,请参阅官方 Nodejs 文档。require 仅返回对加载到 Node 模块缓存中的模块的引用。import 支持存在指向其他模块中对象的局部符号,而 require 只支持指向整个模块。因此,创建引用另一个模块中的变量的局部符号必须经过分配新局部变量的过程。鉴于 Javascript 的性质,如果重新分配这个局部变量,它只会改变它指向的位置,因此模块中需要初始值的变量不会被修改。例子:
上面的例子并不意味着不能在本地代码中修改从模块 x 导出的变量 x。但是当使用局部变量时,我们正在修改的是这个变量。以下示例使用 CommonJS 模块系统修改模块 x 中的变量 x。
可以看出,由于没有使用局部变量,所以可以直接修改模块x的属性x的值。现在可以从需要“x”模块的任何其他模块访问这个新值。