4

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

这是我的切入点:

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

这是我的 formValidator.js:

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

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

4

2 回答 2

6
于 2017-06-02T09:20:18.923 回答
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;
于 2016-06-14T12:53:16.043 回答