【问题标题】:What is the current simplest way to use ES6 / Import statements etc in Node v 10目前在 Node v 10 中使用 ES6 / Import 语句等最简单的方法是什么
【发布时间】:2018-05-23 00:13:41
【问题描述】:

我对 nodejs 还很陌生。随着 nodejs 的发展(我刚刚安装了 v.10),目前在新的 nodejs 项目中使用 ES6 功能(导入语句等)最简单的方法是什么——“正常工作”。我想要最少的依赖和最快的“正常工作”路径的方法。

我发现网上的帖子有点混乱。

  • Babel 之前是为我理解的这种事情安装的
  • Node 10 表示 (Here) 使用 node --experimental-modules my-app.mjs 启用
  • This post 看起来很权威,但我认为它更多地是关于创建包而不是使用语法。

请帮忙!我似乎收到以下错误;

import {MagentoAccountApi} from 'js-magento-client';

错误 1:

SyntaxError: Unexpected token {
    at new Script (vm.js:74:7)
    at createScript (vm.js:246:10)
    at Object.runInThisContext (vm.js:298:10)
    at Module._compile (internal/modules/cjs/loader.js:646:28)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:689:10)
    at Module.load (internal/modules/cjs/loader.js:589:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:528:12)
    at Function.Module._load (internal/modules/cjs/loader.js:520:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:719:10)
    at startup (internal/bootstrap/node.js:228:19)

如果我尝试将文件重命名为具有扩展名 .mjs 并使用以下命令加载: node --experimental-modules .\mtest.mjs ,则会收到此错误:

(node:20224) ExperimentalWarning: The ESM module loader is experimental.
file:///F:/node/magento-test/mtest.mjs:1
import {MagentoAccountApi} from 'js-magento-client';
        ^^^^^^^^^^^^^^^^^
SyntaxError: The requested module 'js-magento-client' does not provide an export named 'MagentoAccountApi'
    at ModuleJob._instantiate (internal/modules/esm/module_job.js:89:21)

我不知道这是包错误还是设置错误。

也许 Babel 仍然是完成这项工作的正确/最简单的方法..?我想我不想开始使用即将被弃用的东西。

【问题讨论】:

  • 因为您才刚刚开始,您真的想使用实验性功能吗?您可以使用普通节点 CommonJS 模块语法(require 和 exports)并避免所有实验性的东西(import 和 export),这几乎肯定会使开始变得更容易。
  • 谢谢@loganfsmyth,是的,我确实想使用最新的功能。我发现 async / await 比 .then 结构和许多其他东西更直观和易于管理。
  • ES 模块语法是一项非常具体的功能,目前仍处于试验阶段。您仍然可以使用任意数量的其他功能,所以问题是,使用新的实验性模块语法的目标是什么。我会说“当前最简单的方法”是使用任何新功能而不是工作,但现在忽略 ES 模块语法。它仍处于试验阶段,因为它仍在不断变化,可能会发生变化。
  • 为什么 Node.js 还不支持 es6 import/export 是因为它还不完善。 IMO,es6 导入/导出与一些 NPM 功能冲突,如optionalDependencies(不确定是否应该关注)。由于require 实际上是一个函数调用,因此您可以有条件地 要求一个模块来使可选依赖项在不存在时不会使进程崩溃;但是,es6 导入会破坏这一点,因为它不能是条件导入。
  • @momocow 这就是动态导入的用途。这不是 require 的替代品,因为它们是异步的。

标签: node.js ecmascript-6 babeljs


【解决方案1】:

目前,对于实验性加载器,CommonJS 互操作性只允许单个默认导出。您不能将命名导出与现有的 CommonJS 模块一起使用,因此目前您必须这样做:

import Magneto from "js-magento-client";
const { MagentoAccountApi } = Magneto;

这是不正确的,但显然正在修复中。

来自NodeJS v10 docs:

当通过import 加载时,这些模块将提供一个default 导出代表 module.exports 在他们当时的值 评估完毕。

import fs from 'fs';
fs.readFile('./foo.txt', (err, body) => {
    if (err) {
        console.error(err);
    } else {
        console.log(body);
    }
});

上面所有的 cmets 都告诉您,从实验性功能开始是个坏主意,都是 100% 正确的。上面就是一个很好的例子。在某些时候,这将发生变化,您将不得不更改您的代码。如果你改用 Babel,你就不会遇到这个问题。

【讨论】:

    猜你喜欢
    • 2017-01-19
    • 2017-05-11
    • 2011-12-22
    • 1970-01-01
    • 2010-10-04
    • 2022-02-04
    • 1970-01-01
    • 2015-09-03
    • 2015-12-18
    相关资源
    最近更新 更多