使用 webpack 导出全局函数

Export global function using webpack

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

这是我的切入点:

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

这是我的 formValidator.js:

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

当我加载生成的包并检查全局 FormValidator 时,它是一个具有验证函数的对象。有什么方法可以让验证函数直接分配给 FormValidator 吗?

不使用 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;

我和你情况一样do.Here是我的代码:

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 打包后,我可以在 window 中访问 eTrack 但结果是一个 object.That 意味着我不能直接调用 eTrack() , 但应该像 eTrack.eTrack().

这样调用

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

module.exports = function eTrack () {

}

这一次捆绑后,我无法在浏览器 window 中访问 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() tag.Though我不知道@Ambroos的答案和这个解决方案之间的区别。