Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用webpack导出全局函数_Javascript_Webpack_Jint - Fatal编程技术网

Javascript 使用webpack导出全局函数

Javascript 使用webpack导出全局函数,javascript,webpack,jint,Javascript,Webpack,Jint,我想写一个同构的模块。服务器javascript将在JINT内部运行。我专门创建了一个webpack包来构建模块的服务器版本。我想公开一个可以让JINT调用的函数。我正在使用来自JINT的scriptEngine.Invoke函数,但是这是在全局对象上查找函数。我不知道如何将函数放到全局对象上。我曾尝试使用expose loader,但这似乎导出了整个模块,我无法让它只公开一个函数 这是我的切入点: require("expose?FormValidator!./formValidator.js

我想写一个同构的模块。服务器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导出时会执行以下操作:

export default function testDefault() {}
export function testNamed() {}
// 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;
变成

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与之配对使用

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

export default function testDefault() {}
export function testNamed() {}
// 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;

我的处境和你一样。这是我的密码:

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 () {

}
这次绑定后,我无法在浏览器窗口中访问
eTrack
eTrack
对象消失,它在控制台中抛出
eTrack未定义
错误

然后我发现了一篇很有帮助的文章:

并将我的
index.js
更改为:

function eTrack () {

}
module.exports = eTrack;

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

不,它不起作用。使用
模块。导出
会导致
在窗口中变得未定义。但这并不是完全错误,只要稍加修改,我们就可以让它工作。请检查我的答案,如果有错误请更正。您有webpack 2解决方案的typescript版本吗?在webpack 2中,您不能混合ES6导入和CommonJS导出。如果您使用module.exports,您还应该使用require,如果您使用import,您应该使用export与之配对。@Ambroos实际上我使用的是webpack 2,它工作得很好。