【问题标题】:Expose two (or more) Node.js Babel classes in a NPM scoped package在 NPM 范围包中公开两个(或更多)Node.js Babel 类
【发布时间】:2017-09-08 11:18:08
【问题描述】:

我在一个公共范围的包中有两个 Node.js Babel 类,并希望将它们都公开。

公共范围 NPM 中的类:

索引.js

export default class Index {
    constructor() {
        console.log("abc!");
    }
}

SecondClass.js

export default class SecondClass {
    constructor() {
        console.log("SecondClass! SecondClass!! SecondClass!!!");
    }
}

在公共范围的 NPM 中,我只能设置一个主文件:

"main": "./dist/index.js",

在使用项目中,我试图将它们都导入,但我失败了!

import { Index, SecondClass } from '@my-scope/my-package';

new Index();
new SecondClass();

依赖关系:

"devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-preset-es2015": "^6.24.1"
}

我该怎么做?我能做到吗?


更新 1: 即使在包中使用 files 也不起作用,而且更糟的是,一旦我使用它,当我将作用域包安装在使用项目。

"files": [
    "./dist/index.js",
    "./dist/SecondClass.js"
],

更新 2:我尝试使用前面提到的 "files":[ ... ],一旦我找不到任何解决方法,我在 NPM Github 中发布了一个问题:https://github.com/npm/npm/issues/18481

【问题讨论】:

    标签: javascript node.js npm babeljs


    【解决方案1】:

    经过数小时的研究,我找到了一种使用原版代码但保留 Babel 用法的解决方法。

    对于作用域 NPM 包中的主 JS 文件,例如index.js 您必须导出所有类,例如:

    import SecondClass from './SecondClass';
    import ThirdClass from './ThirdClass';
    
    export {
        SecondClass,
        ThirdClass
    };
    

    在您的使用项目中,您可以像这样导入:

    import { SecondClass, ThirdClass } from '@my-scope/my-package';
    
    new SecondClass();
    new ThirdClass();
    

    您的作用域 NPM 包中的 package.json 只需要像 "main": "./dist/index.js" 一样公开 index.js

    依赖和版本:

    • “babel-cli”:“^6.26.0”
    • "babel-preset-es2015": "^6.24.1"
    • $ npm -v: 3.10.10
    • $节点-v:v6.11.3

    【讨论】:

      【解决方案2】:

      常见的方法是创建一个名为 index.js 的文件,以便重新导出文件夹中的不同模块:

      /src
          /foo.js
          /bar.js
          /index.js
      
      // index.js
      export * from './foo';
      export * from 'bar';
      

      这将允许您直接从文件夹而不是特定文件导入。

      import {foo, bar} from './src';
      

      【讨论】:

      • 我没有得到你的方法,我正在使用包所以我将如何使用src 文件夹?!
      • 这只是一个示例,惯例是创建一个 index.js 文件来导出其余文件。
      • 你试过了吗?我根据您的想法尝试了许多方法,但都没有奏效,您有任何可行的用例吗?谢谢
      • 您应该查找 ES6 导入/导出教程,您需要了解一些背景知识才能了解它们是如何工作的。也可以在github上找js库或者项目,你就明白了。
      【解决方案3】:

      有可能,试试这个:

      Index.js

      import SecondClass from './SecondClass';
      
      class Index {
          constructor() {
              console.log("abc!");
          }
      }
      export { Index, SecondClass };
      

      用法

      import { Index, SecondClass } from '@my-scope/my-package';
      
      new Index();
      new SecondClass();
      

      【讨论】:

      • 我非常喜欢这个想法,但如果我有多个,超过两个,有没有通用的解决方案?
      • 我不知道其他解决方案。但是如果我们要导出很多对象,我认为旧的 module.export 会更甜,但在你的情况下不推荐。
      • 嗯,不知道为什么不能编译。可能在您只能导出为json 就像您的答案可能有效。
      • 我给了一个-1,因为你在我的回答之后编辑了你的问题+你上面的评论没有意义!
      • Np 伙计。对我来说没关系。我修正了我的答案,以免给其他人带来问题。很高兴您找到了解决方案 :)
      猜你喜欢
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多