代码之家  ›  专栏  ›  技术社区  ›  bhantol

如何导入/使用中的ES6模块。js扩展——实验模块?

  •  0
  • bhantol  · 技术社区  · 8 年前

    我的 mjs 文件可以导入其他 mjs公司 文件,但无法导入 js 导入链中的文件。在下面的例子中,想象甘蓝。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——实验模块/测试/苹果。mjs(节点:389272) 实验警告:ESM模块加载程序是实验性的。 “甘蓝” 检查完成时(内部/加载程序/模块作业:75:27) 在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)
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   John-David Dalton    8 年前

    您可以尝试使用 @std/esm 装载机 "@std/esm":"cjs" 选项:

    • 安装 @std/esm ( npm i --save @std/esm )
    • 添加 到您的包裹。json
    • 现在 node -r @std/esm apple.mjs 将成功加载
    推荐文章