【问题标题】:Using Sapper ESM module loader in node: `import *` fails在节点中使用 Sapper ESM 模块加载器:`import *` 失败
【发布时间】:2019-09-02 04:30:03
【问题描述】:

我希望在项目中使用 ES2015 模块。每the node documentation, I am enabling the .esm loader

~\Code\spa-test $ node --experimental-modules                                                                           (node:8104) ExperimentalWarning: The ESM module loader is experimental.                                               

> import * as sapper from '@sapper/server';                                                                             Thrown:
import * as sapper from '@sapper/server';
       ^

SyntaxError: Unexpected token *

我也试过了:

import {middleware} from '@sapper/server';

SyntaxError: Unexpected token { 失败

如何让 node.js 加载 @sapper/server ESM 模块?

【问题讨论】:

  • 您的目标是使用import 还是您也可以考虑使用require

标签: node.js es6-modules sapper


【解决方案1】:

您需要将代码保存在扩展名为“.mjs”的文件中,以将其标记为 ES6 模块。

在 Node.js V12 中还有一个命令行开关 "--input-type=module",它可能在交互式使用 Node.js (REPL) 的情况下起作用。

'@sapper/server' 在 Node.js 中不是合法的模块路径。模块文件名的路径必须以'.''..' 开头,文件扩展名必须是'.mjs',因此合法的导入语句应该是

import * as sapper from './@sapper/server.mjs';

当“@sapper”不是模块文件名而是包名并且 package.json 定义包含“"type": "module"”时,它也应该可以工作(我还没有测试过)。

另请参阅documentation of "Node.js V12 ECMAScript Modules""Node.js V10 ECMAScript Modules"

【讨论】:

  • 谢谢。但是使用.mjs 也不起作用。我的代码是import * as sapper from './@sapper/server.mjs';。错误是Error: Cannot find module '@sapper/server' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
  • 请参阅上面的更新答案。这取决于“@sapper”是 Node.js 包(带有 package.json)还是只是一个包含名为 server.mjs 的 ES 模块文件的目录。
  • 你的目录结构是什么样的?是否有目录“node_modules/@sapper”或者它被称为“node_modules/sapper”?这是一个 ES 模块(通过“import”使用)还是一个 Node.js 模块(通过“require()”使用)?这是是你写的模块还是你引用了现有的模块?
  • 当使用“sapper”时,您的项目中有一个文件“my-app/src/node_modules/@sapper”,该文件在“my-app/src/server.js”中引用。我不知道 sapper 是如何工作的,但是当您在 my-app/src 目录中加载该模块时,它会起作用。您的问题是工兵特有的问题,而不是一般的 Node.js 模块问题。
  • 你是完全正确的。我在 Discord 上与 Sapper 开发人员聊天,他们帮助回答了这个问题。
【解决方案2】:

正如@michaeldrehner 提到的,这是一个特定于 Sapper 的问题(我已经编辑了标题以反映这一点)。

我的问题是

  • src 中的文件是 sapper 的输入,并非设计为由节点直接加载。

  • npm buildsapper build 会将 sapper *and( server.js 汇总到一个包中。此输出位于 `sapper/build/server/server.js

  • 该包可以由节点node .\__sapper__\build\index.js 加载,无需任何额外的魔法——该包被转换为适当的节点兼容模块格式。

感谢 Discord 上的 Sapper 开发者帮助回答这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 2020-10-31
    • 2020-12-23
    • 2023-03-08
    • 2021-12-05
    • 2022-06-18
    • 2017-04-23
    • 1970-01-01
    相关资源
    最近更新 更多