在节点中使用Sapper ESM模块加载器:“导入*”失败

时间:2019-08-30 23:31:35

标签: node.js es6-modules sapper

我希望为项目使用ES2015模块。根据{{​​3}}:

Optional({
    "cloud_score" = "0.03926652301686606";
    date = "2014-02-04T03:30:01";
    id = "LC8_L1T_TOA/LC81270592014035LGN00";
    resource =     {
        dataset = "LC8_L1T_TOA";
        planet = earth;
    };
    "service_version" = v1;
    url = "https://earthengine.googleapis.com/api/thumb?thumbid=bc77b079c8ecd07cd668c576c22b83a4&token=51a4298b6aae4529caee9ed0b64e636f";
}) 

我也尝试过:

~\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';

如何使node.js加载SyntaxError: Unexpected token { ESM模块?

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

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

我的问题是

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

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

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

感谢Discord上的Sapper开发人员在回答此问题方面的帮助。