【问题标题】:Export global function using webpack使用 webpack 导出全局函数
【发布时间】:2016-06-13 15:02:21
【问题描述】:

我正在尝试编写一个同构模块。服务器 javascript 将在 JINT 内部运行。我专门创建了一个 webpack 包来构建模块的服务器版本。我想公开一个可以让 JINT 调用的函数。我正在使用 JINT 的 scriptEngine.Invoke 函数,但是这是在全局对象上寻找一个函数。我不知道如何将函数添加到全局对象上。我试过使用expose-loader,但这似乎导出了整个模块,我不能让它只暴露一个函数。

这是我的切入点:

require("expose?FormValidator!./formValidator.js");

这是我的 formValidator.js:

export default function validate () {
    return 'HelloWorld';
}

当我加载生成的包并检查 FormValidator 全局时,它是一个具有验证功能的对象。有没有办法让验证函数直接分配给 FormValidator?

【问题讨论】:

    标签: javascript webpack jint


    【解决方案1】:

    我的情况和你一样。这是我的代码:

    webpack.config.js:

    module.exports = {
        entry: './src/method/eTrack/index.js',
        output: {
            filename: 'eTrack.js',
            path: path.resolve(__dirname, 'dist'),
            library: 'eTrack',
            libraryTarget: 'umd'
        },
    };
    

    ./src/method/eTrack/index.js:

    import create from './create';
    import getAll from './getAll';
    import getByName from './getByName';
    import remove from './remove';
    
    export function eTrack () {
    
    }
    eTrack.trackers = [];
    eTrack.create = create;
    eTrack.getAll = getAll;
    eTrack.getByName = getByName;
    eTrack.remove = remove;
    

    好吧,通过 webpack 捆绑后,我可以在窗口中访问 eTrack,但它原来是一个对象。这意味着我不能直接调用 eTrack(),但应该像 eTrack.eTrack() 一样调用。

    我也试过@Ambroos的解决方案,把./src/method/eTrack/index.js改成:

    module.exports = function eTrack () {
    
    }
    

    这次捆绑后,我无法在浏览器窗口中访问eTrackeTrack 对象消失并在控制台中抛出eTrack is undefined 错误。

    然后我找到了一篇很有帮助的文章:http://siawyoung.com/coding/javascript/exporting-es6-modules-as-single-scripts-with-webpack.html

    并将我的 index.js 更改为:

    function eTrack () {
    
    }
    module.exports = eTrack;
    

    然后一切都按预期进行!我可以直接在<script> 标签中调用eTrack()。虽然我不知道@Ambroos 的答案和这个解决方案之间的区别。

    【讨论】:

    • 在 webpack 2 中,你不能混合使用 ES6 导入和 CommonJS 导出。如果你使用 module.exports,你也应该使用 require,如果你使用 import,你应该使用 export 与它配对。
    • @Ambroos 实际上我使用的是 webpack 2,它运行良好。
    【解决方案2】:

    不要使用 ES6 导出语法,而是尝试简单地使用 module.exports = function validate() {},它应该可以工作。

    Babel 可能就是为什么现在事情没有按照您期望的方式运行。使用 Babel 导出执行以下操作:

    export default function testDefault() {}
    export function testNamed() {}
    

    变成

    Object.defineProperty(exports, "__esModule", {
      value: true
    });
    exports.default = testDefault;
    exports.testNamed = testNamed;
    function testDefault() {}
    function testNamed() {}
    

    在这种情况下,您导出的对象将具有 default() 和 testNamed()。

    webpack 2 更新:在 webpack 2 中,您不能混合使用 ES6 导入和 CommonJS 导出。如果你使用 module.exports,你也应该使用 require,如果你使用 import,你应该使用 export 配对。

    在 webpack 2 中,您不能使用 ES6 默认导出来使全局可用。目前最常用的解决方案是创建一个小的入口点,只需执行以下操作:

    // assuming myLibraryEntry is the default export in the required file.
    const myLibraryEntry = require('./real-entry-point-in-es6.js').default;
    
    // This makes myLibraryEntry available as whatever you set libraryName to in your config.
    module.exports = myLibraryEntry;
    

    【讨论】:

    • 不,它不起作用。使用module.exports 导致library 在窗口中变得未定义。
    • 不过也不是全错,稍微修改一下就可以了。能否请您检查一下我的回答,如果有错误更正一下?
    • 你有 webpack 2 解决方案的 typescript 版本吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多