0

我希望将 ES2015 模块用于项目。根据节点文档,我正在启用.esm加载器

~\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/serverESM 模块?

4

2 回答 2

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"”时,它也应该可以工作(我还没有测试过)。

另请参阅“Node.js V12 ECMAScript 模块”“Node.js V10 ECMAScript 模块”的文档

于 2019-08-31T11:42:54.440 回答
0

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

我的问题是

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

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

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

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

于 2019-09-01T20:30:03.990 回答