【问题标题】:How may I import a Node module in the client code of my Electron app?如何在我的 Electron 应用程序的客户端代码中导入 Node 模块?
【发布时间】:2018-05-22 03:59:40
【问题描述】:

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

不过,现在我有一个问题:我打算在客户端和服务器上使用来自Immutable JS 的类型,我只知道如何将它们导入服务器代码。到目前为止,同构代码中的所有 import 语句都引用了应用程序中的其他 JS 模块,而不是来自 npm 的依赖项。如下所示的模块会在应用加载时在客户端中导致“Uncaught TypeError: Failed to resolve module specifier 'immutable'”运行时错误:

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

事实上,我几乎可以肯定 import 语句失败了,因为 Chromium 无法将“不可变”解析为 JS 文件。但是我该怎么解决呢?有没有一种方法可以解决它,它适用于任何编写为同构的节点模块?

【问题讨论】:

    标签: electron es6-modules


    【解决方案1】:

    TL;DR - 只要你使用 npm 模块,你就不能没有像 webpack 这样的打包工具的帮助。

    大部分 node.js 包生态系统还没有为原生模块做好准备。目前 npm 中大约 99% 的已发布包使用 node.js 的 CommonJS 模块系统,而编写支持 esm 的模块非常少(ES 模块语法也是如此)。

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

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

    【讨论】:

    • 老鼠!哦,好吧,我想我会找到一个轻量级的捆绑器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2017-05-20
    • 2018-07-21
    相关资源
    最近更新 更多