我正在考虑更新Node/Express代码以使用import而不是require,方法是在package.json文件中添加行:
"type": "module",但是,我不知道为什么我看到的大多数Node/Express代码仍然使用require,而我通过webpack在浏览器中看到的代码使用导入。
这种二元性有什么原因吗?一般建议升级为进口吗?进口是因为它是新的,被认为是一种升级和更好的技术吗?
这个以前的Q/A已经有7年多的历史了,并且拥有大量的历史信息。我正在寻找更多的最新信息,因为语言已经发展。
发布于 2022-02-28 22:11:01
有两种类型的模块的原因纯粹是历史原因。
早在2009年创建Node.js时,ES模块(import语法)还不存在,但还有其他非标准的替代方案,其中最重要的是AMD和CommonJS,可供使用的浏览器有几个。Node.js决定采用CommonJS (require语法)。因此,所有部署到2015年的包都是CommonJS包。
原生ES模块是在ECMAScript 2015标准中引入的,但它们只是在2017年将其作为Node.js 8.5中的一项实验技术,直到2019年的Node.js 12 (2019年),它们的支持才足够好地将它们作为CommonJS的替代品(尽管这是主观的)。因此,为Node.js开发的大部分软件仍然使用带有require语句的CommonJS模块。
ES模块是否更好是一个意见问题,而不是StackOverflow的一个恰当问题。至少,它们是标准的JavaScript,这使得它们适合在浏览器和Node.js中使用,这是imo的一个很大的优势。
缺点是在CommonJS代码中不需要ES模块--相反: ES模块可以导入CommonJS模块--因此,如果您的任何依赖项使用ES模块,那也是将您的代码切换到ES模块的好机会。
那么,我们应该升级到一般使用import吗?当然,这也是一个意见问题。如果这是我的观点,答案将是“不”,因为没有理由改变运行的系统。CommonJS代码不会因为现在存在更好的替代方案而生锈或恶化,尽管ES模块是新代码的更好选择。只要人们使用Node.js,也不会放弃对CommonJS的支持。
有一个名为德诺的项目,该项目旨在为Node.js提供更现代化和安全的替代方案,以便在服务器上运行JavaScript代码。Deno最初被设计为只与ES模块一起工作,但很快就很明显,不支持CommonJS模块是一个主要问题,因为有那么多npm包不起作用,所以它引入了一个兼容模式来支持旗子下的CommonJS模块。这个故事的寓意是:取消对require的支持是个好主意,但是重新添加它是一个更好的主意。
https://stackoverflow.com/questions/71290815
复制相似问题