如何在Electron应用程序的客户端代码中导入Node模块?

时间:2018-05-21 17:03:55

标签: electron es6-modules

我正在使用Electron 2(用于Chromium 61+)和服务器端esm shim从ES6模块构建棋盘游戏。这是我第一次编写同构JavaScript,更不用说ES6模块了;我打算能够在单人模式下在客户端上运行游戏逻辑,在网络游戏模式下在服务器上运行。到目前为止一切顺利,我很乐意报道!它不满足于不依赖任何沉重的转录器。

现在,我有一个问题:我打算在客户端和服务器上使用来自Immutable JS的类型,我只知道如何将它们导入服务器代码。到目前为止,同构代码中的所有import语句都引用了应用程序中的其他JS模块,而不是来自npm的依赖项。像下面这样的模块导致"未捕获的TypeError:无法解析模块说明符' immutable'""应用程序加载时客户端中的运行时错误:



import Immutable from "immutable";
Immutable.List.of([]);
export { foo: {} };




事实上,我几乎可以肯定导入声明失败了,因为Chromium无法解决" immutable"到一个JS文件。但我该如何解决呢?有没有办法解决它,适用于任何编写为同构的节点模块?

1 个答案:

答案 0 :(得分:2)

TL; DR - 只要你使用npm模块,你就不能没有像webpack这样的捆绑器的帮助。

大多数node.js软件包生态系统还没有为本机模块做好准备。目前npm中约99%的已发布包使用node.js的CommonJS模块系统,而编写的模块很少支持esm(ES模块语法)。

esm shim旨在帮助后者 - 如果模块用esm编写并导入当前node.js版本不支持它有助于解决这些模块。相反的情况不起作用。 Chromium可以直接导入您的代码,这是用本机语法编写的,然后尝试解析您指定的依赖模块,并且无法解析为1.它不知道在哪里解析(因为它不遵循node.js的模块解析规则) 2.当它可以解决时,实际导入将失败,因为模块将是cjs导出而不是本机。

返回TL;上面的DR - 如果打算在两个进程上运行同构代码,请相应地使用bundler。