【问题标题】:How to import/consume ES6 modules which are in .js extension with --experimental-module?如何使用 --experimental-module 导入/使用 .js 扩展名中的 ES6 模块?
【发布时间】:2018-04-29 03:25:36
【问题描述】:

我的mjs 文件可以导入其他mjs 文件,但不能导入导入链中的js 文件。在下面的示例中,假设 kale.js 是一个 3rd 方库,例如lodash-es/isObject.js 例如

// apple.mjs
import {banana} from './banana.mjs';

..和

// banana.mjs
import {kale} from './kale.js';
export function banana() {};

而kale.js 是

// kale.js
export function kale() {};
export function kite() {}

我收到以下错误:-

$ node --experimental-modules ./test/apple.mjs (node:389272) ExperimentalWarning: E​​SM 模块加载器是实验性的。 SyntaxError:请求的模块不提供名为的导出 '羽衣甘蓝' 在 checkComplete (internal/loader/ModuleJob.js:75:27) 在 moduleJob.linked.then (internal/loader/ModuleJob.js:58:11) 在

尝试了自定义解析功能,但仍然没有运气:

import url from 'url';
import path from 'path';


const JS_EXTENSIONS = new Set(['.js', '.mjs']);

export default function resolve(specifier, parentModuleURL, defaultResolve ) {
  console.log('resolving '+specifier);
  if (/^\.{0,2}[/]/.test(specifier) !== true && !specifier.startsWith('file:')) {
    return defaultResolve(specifier, parentModuleURL);
  }
  const resolved = new url.URL(specifier, parentModuleURL);
  const ext = path.extname(resolved.pathname);
  if (!JS_EXTENSIONS.has(ext)) {
    throw new Error(
      `Cannot load file with non-JavaScript file extension ${ext}.`);
  }
  return {
    url: resolved.href,
    format: 'esm'
  };
}

我是这样运行的:

node --experimental-modules --loader ./custom-loader.mjs apple.mjs

节点版本 v8.9.1

我收到以下错误:

SyntaxError: Unexpected token export
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:599:28)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at createDynamicModule (internal/loader/ModuleRequest.js:43:15)
    at setExecutor (internal/loader/ModuleWrap.js:40:23)
    at file:///C:/Users/user/projs/dev/my-project-js/test/es2015/test/kale.js:8:36

更新 --- 根据答案使用@std/esm 方法

所有代码都在这里https://github.com/yogeshgadge/mjs-mixed-loaders.git

这是有效的:

//index.js
require = require("@std/esm")(module,{"esm":"js"});
module.exports = require("./apple.mjs").default;

然后我运行它如下(现在我正在吃羽衣甘蓝:)):-

$ node index.js
eating kale with some lodash

package.json 方法无效。

$ node -r @std/esm apple.mjs
C:\Users\myuser\projs\github\mjs-in-harmony\node_modules\lodash-es\isObject.js:31
export default isObject;
^^^^^^

SyntaxError: Unexpected token export
    at createScript (vm.js:74:10)
    at Object.runInThisContext (vm.js:116:10)
    at Module._compile (module.js:537:28)
    at Object.Module._extensions..js (module.js:584:10)

【问题讨论】:

  • 你不应该在 .js 文件中使用 ES6 export 语法。只需将其重命名为 kale.mjs。
  • 我正在演示其他 ES6 模块,这些模块被广泛命名为 .js,不在我的控制范围内。例如lodash-es/isObject.js 是 export default isObject;
  • @Bergi 我已经更新了我的问题标题和说明。
  • 我认为 lodash 仍然需要转译。或者,您可以尝试在他们的 repo 中打开一个问题,要求他们重命名他们的文件以原生使用 node.js。最后一个选项似乎是 custom resolve hook,它告诉节点 lodash .js 文件是 ES 模块,无论其文件扩展名如何。
  • Loader hooks 似乎更划算 - 谢谢 - 我会玩它并在这里发布它。打开 lodash 或许多将 ES5 转译代码与 ES6 导入/导出捆绑在一起的库的问题将需要它们将扩展名更改为 .mjs。理想情况下,这将是可爱的。

标签: javascript node.js es6-modules


【解决方案1】:

您可以尝试使用带有"@std/esm":"cjs" 选项的@std/esm 加载程序:

  • 安装@std/esm (npm i --save @std/esm)
  • 将 "@std/esm":"cjs" 添加到您的 package.json 中
  • 现在node -r @std/esm apple.mjs 将成功加载

【讨论】:

  • 不得不使用require = require("@std/esm")(module,{"esm":"js"}); packahe.json 不起作用
  • @bhantol 您的 repo 使用与您在 stackoverflow 中概述的示例不同。我评论了 repo 中的调整。
  • 试图让node -r @std/esm apple.mjs 工作。我更新了回购。只有{"es": "js"} 似乎有效,而不是您发布的答案。有什么理由吗?或者我怎样才能让你的选择也起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 2018-07-18
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2019-10-22
  • 2021-01-21
相关资源
最近更新 更多