我正在尝试将exports-loader
与我的webpack配置一起使用,但是在尝试配置它时遇到了问题。
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve('./src/globals.js'),
use: 'exports-loader?file,parse=helpers.parse'
}
]
}
};
./ src / globals.js
var file = 'blah.txt'
var helpers = {
test: function() { console.log('test something'); },
parse: function() { console.log('parse something'); }
}
./ src / index.js
import { file } from './globals.js'
console.log('the file', file);
我的应用程序构建良好,但是当我尝试运行它时,我得到:
WebpackOptionsValidationError:无效的配置对象。已使用与API架构不匹配的配置对象初始化了Webpack。
- configuration.module.rules [0] .test应该是以下之一:
- configuration.module.rules [0] .test:提供的值“ ./src/globals.js”不是绝对路径!
要完全清楚,我了解绝对路径和相对路径之间的区别,并且我知道我使用的值是相对路径。我的困惑有两个方面:
require.resolve
允许相对路径,所以为什么不能使用它
在这里?我尝试为test
属性使用绝对路径,如下所示:
test: require.resolve(path.join(__dirname, 'src/globals.js'))
但是尝试运行时出现此错误:
错误:找不到模块'/workspace/my-app/dist/src/globals.js
所以我被困住了。如何正确配置此加载器以正确引用该文件?
答案 0 :(得分:0)
exports-loader
工作 Exports loader是一个Webpack加载器,它允许将exports
句子动态添加到与其一起加载的javascript文件中。例如,您的globals.js
文件中没有任何export
,只有file
和helpers
变量,但是使用exports-loader
它可以工作好像它有export
子句。
基本上,要使用加载程序,我们必须提供test
和use
子句。 test
可以是正则表达式,数组或对象,基本上可以决定哪些文件将使用某些加载程序。
use
子句决定将哪些加载程序应用于与test
正则表达式匹配的文件。
在这种情况下,我们应该-例如-指示webpack用globals.js
加载exports-loader
:
module: {
rules: [
{
test: /globals.js/,
use: 'exports-loader',
}
]
}
这是-afaik-使用装载程序的最常用方法。但是,Webpack具有许多配置选项和不同的有效语法。
执行此操作后,当webpack找到require
或import
再次是globals.js
文件时,它将使用exports-loader
。
另一方面,exports-loader
的工作方式是修改require
调用以指示其如何在所需文件中提取变量。就像他们的文档中一样:
file.js
const file = 'foo';
app.js
const file = require('exports-loader?file!./file.js');
console.log(file); // foo
因此,基本上,您需要做两件事才能使exports-loader
起作用:
使用require
或import
及其特殊语法。
像往常一样将加载程序加载到webpack.config.js
中(他们会在其文档中跳过此操作)。
相反,您尝试在exports-loader
文件中使用特定的webpack.config.js
语法,然后将其与import
一起使用。
因此,坏消息是exports-loader
在每个require
或import
语句中都需要某种特殊的格式来实现其魔术。您只是无法在尝试时在配置文件中指定此设置(或者,至少我不知道如何设置)。
因此,要使其正常工作,您需要:
webpack.config.js
。index.js
文件,使其使用exports-loader
魔术:import file from 'exports-loader?file!./deps.js'
console.log('the file', file);