【问题标题】:How to expose an es6 module globally如何全局公开 es6 模块
【发布时间】:2016-08-16 15:22:40
【问题描述】:

我需要编写一个可在全局窗口中使用的模块。
我使用 es6 创建模块,我定义的每个类都有自己的文件。
我正在使用 webpack 对这些类进行 babelify 和捆绑。
我的模块的入口点也是包含要公开的全局的文件。

我已经尝试了所有方法来实现这一点,包括:

  • 暴露加载器
  • 导入加载器
  • 出口商加载器
  • 输出:库
  • 黑魔法:(

我尝试过的代码示例:

我想得到:window.MyMod

// mymod.js
export class MyMod {
    constructor(aaa) {
        this.aaa = aaa;
    }
    toString() {
        return this.aaa;
    }
}

// webpack.config
var entries = [
    './src/mymod.js'
];
module.exports = {
    ...,
    module: {
      loaders: [
            {
                test: require.resolve('./src/mymod.js'),
                loader: 'expose?MyMod'
            },
            {
                test: /\.js$/,
                exclude: /node_modules/,
                loader: 'babel-loader',
                query: {
                    presets: ['es2015']
                }
            }
    ]
}

这只会在包含 MyMod 作为构造函数的窗口上为我获取一个对象 MyMod。

任何帮助将不胜感激。

【问题讨论】:

  • 不是一个配置解决方案,但你不能只为你的模块提供一个索引文件import lib from './lib'; window.lib = lib
  • 如果我错了,请纠正我,但你是说:我正在使用 webpack 对这些类进行 babelify 和捆绑......这个只会在窗口上给我一个对象 MyMod,它包含 MyMod 作为构造函数。 这不正是 bable 在编译 ES6 时所做的吗?类将被编译为构造函数,因为在 ES5 中类不存在。
  • 也许我应该以某种方式将类包装在返回 MyMod 的匿名自调用函数中?
  • 您是否尝试过使用ProvidePlugin

标签: javascript module ecmascript-6 global-variables webpack


【解决方案1】:

您应该在 Webpack 的配置中将 export default class FoolibrarylibraryTarget 设置结合起来。比如:

// src/Foo.js
export default class Foo { ... }

// webpack.config.json
{
  "output": {
    "library": "Foo",
    "libraryTarget": "var"
  }
}

加载包后,您应该能够以window.Foo 的身份使用该库。

【讨论】:

  • 试过了,没用。导致一个空的 window.Foo 对象
  • @bldoron 您是否也在配置中设置了entry?我认为这可能是获得可靠的全局变量所必需的。
【解决方案2】:

这与Exporting a class with Webpack and Babel not working 基本上是相同的问题,除了您有一个命名导出而不是默认导出。你的入口文件应该是

import {MyMod} from './mymod';
module.exports = MyMod;

module.exports = require('./mymod').MyMod;

如果您不想执行任何这些操作并将'./src/mymod.js' 作为入口文件,请在该文件中使用 CommonJS 导出而不是 ES6 导出:

// mymod.js
exports.MyMod = class MyMod {
    constructor(aaa) {
        this.aaa = aaa;
    }
    toString() {
        return this.aaa;
    }
}

【讨论】:

  • 您可能需要更具体一些,否则无法为您提供帮助。
  • 对不起,你是对的。您的第一个解决方案是不可能的,因为我没有在任何地方导入文件,我需要构建它。第二个,我试过了,但是这个:require.resolve('./src/mymod.js') 和这个 require.resolve('./src/mymod.js').MyMod 导致了相同的 window.MyMod.MyMod。
  • “你的第一个解决方案是不可能的,因为我没有在任何地方导入文件,”我说你必须创建一个新的入口文件使用该内容,而不是使用 ./src/mymod.js 作为入口文件。 IE。使用我的答案中的内容创建一个文件 ./src/entry.js 并配置 webpack 以使用它:var entries = [ './src/entry.js'];
  • 我一直在努力避免这种情况,这听起来像是一种黑客行为。我想我会做 jquery 所做的事情,并以某种方式将类包装在一个返回 MyMod 的匿名自调用函数中。我会用这个尝试报告——尽管它也是一个 hack。
  • 嗯,您正在尝试使 ES6 模块与为 CommonJS 模块构建的工具一起工作。如果您不想使用任何建议并将./src/mymod.js 作为入口文件,那么您应该使用CommonJS 模块定义而不是ES6:exports.MyMod = class MyMod {};。完全没有必要像 jQuery 那样实现包装器,因为这正是 webpack 为您所做的。
猜你喜欢
  • 2016-06-06
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 2014-04-04
  • 2022-11-10
  • 1970-01-01
相关资源
最近更新 更多