繁体   English   中英

如何使用--experimental-module导入/使用.js扩展名中的ES6模块?

[英]How to import/consume ES6 modules which are in .js extension with --experimental-module?

我的mjs文件可以导入其他mjs文件,但不能在导入链中导入js文件。 在以下示例中,假设kale.js是第三方库,例如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)实验警告:ESM模块加载程序是实验性的。 语法错误:请求的模块未在moduleJob.linked.then(internal / loader / ModuleJob.js:58:11)的checkComplete(internal / loader / ModuleJob.js:75:27)处提供名为“ kale”的导出

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

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)

您可以尝试将@ std / esm加载程序与"@std/esm":"cjs"选项结合使用:

  • 安装@std/esmnpm i --save @std/esm
  • "@std/esm":"cjs"到package.json
  • 现在node -r @std/esm apple.mjs将成功加载

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM