webpack - 无法使新版本的暴露加载器和样式加载器工作
问题描述
我真的需要帮助来弄清楚为什么我无法解决这些错误:
Module build failed (from ../node_modules/css-loader/dist/cjs.js):
Error: Can't resolve '/images/loading.gif'
错误源于此行:
background: url(/images/loading.gif) center center no-repeat;
然后我们有这个:
_ERROR in ../node_modules/moment/moment.js (../node_modules/expose-loader/dist/cjs.js?moment!../node_modules/moment/moment.js)
Module build failed (from ../node_modules/expose-loader/dist/cjs.js):
ValidationError: Invalid options object. Expose Loader has been initialized using an options object that does not match the API schema.
- options misses the property 'exposes'. Should be:
non-empty string | object { globalName, moduleLocalName?, override? } | [non-empty string | object { globalName, moduleLocalName?, override? }, ...] (should not have fewer than 1 item)_
我不知道该去哪里寻求帮助。我搜索了很多,通读了 webpack 文档和指南。遵循了一些升级到 webpack 5 的指南。
我想要做的是从 webpack 4 更新到 5。我将 Expose-loader 从 0.7.5 更新到 2.0.0,并将 css-loader 从 3.5.3 更新到 5.2.4。现在我无法通过上述错误,其中有几个指向不同的文件,其中一些是入口文件。
出于测试目的,我回滚了所有内容,只是将expose-loader更新到1.0.3(2.0.0仅适用于WP5)和css-loader到5.2.4,并且在相同的文件上再次出现相同的错误。所以我的猜测是 webpack.config 的配置方式一定有问题。
const path = require("path");
module.exports = {
context: path.join(__dirname, "Bla"),
entry: {
bla: ["./bla"],
bla_app: ["./bla_app"],
bla2: ["@babel/polyfill", "./bla2"], //need @babel/polyfill for pechkin
bla3: ["./bla3"],
bla4: ["./bla4"],
bla_5: ["@babel/polyfill", "./SinglePage/bla_5.js"], //need @babel/polyfill for redux/saga in IE
bla_6: ["@babel/polyfill", "./SinglePage/bla_6.js"], //need @babel/polyfill for redux/saga in IE
},
output: {
filename: "[name].bundle.js",
path: path.resolve(__dirname, "wwwroot", "build"),
},
module: {
rules: [
{
enforce: "pre",
test: /\.(js|jsx)$/,
exclude: /node_modules/,
loader: "eslint-loader",
},
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
},
},
{
test: /\.css$/i,
use: ["style-loader", "css-loader"],
},
{
test: /\.(jpe?g|png|gif|woff|woff2|eot|ttf|svg)(\?[a-z0-9=.]+)?$/,
loader: "url-loader?limit=100000",
},
// Expose jquery so that it is possible to use jquery in client that is
// extended by plugins, for example bootstrap-select
{
test: require.resolve("jquery"),
loader: "expose-loader?$!expose-loader?jQuery",
},
// Expose jquery so that it is possible to use jquery in client that is
// extended by plugins, for example bootstrap-select
{
test: /jquery\..*\.js/,
loader: "imports?$=jquery,jQuery=jquery,this=>window",
},
],
},
resolve: {
extensions: [".js", ".jsx"],
alias: {
//........//
},
},
};
和 .dev.js
const merge = require("webpack-merge");
const common = require("./webpack.common.js");
module.exports = merge(common, {
mode: "development",
devtool: "inline-source-map",
devServer: {
contentBase: "./build",
disableHostCheck: true,
},
});
我尝试更新到 WP5 后相同文件的外观:
const path = require("path");
const ESLintPlugin = require("eslint-webpack-plugin");
const webpack = require('webpack');
module.exports = {
context: path.join(__dirname, "Bla"),
plugins: [
new ESLintPlugin({
extensions: ["js", "jsx"],
exclude: ["node_modules"]
}),
// new webpack.ProvidePlugin({
// $: 'jquery',
// jQuery: 'jquery',
// }),
// new webpack.ProvidePlugin({
// _: 'lodash',
// }),
],
entry: {
bla: ["./bla"],
bla_app: ["./bla_app"],
bla2: ["@babel/polyfill", "./bla2"], //need @babel/polyfill for pechkin
bla3: ["./bla3"],
bla4: ["./bla4"],
bla_5: ["@babel/polyfill", "./SinglePage/bla_5.js"], //need @babel/polyfill for redux/saga in IE
bla_6: ["@babel/polyfill", "./SinglePage/bla_6.js"], //need @babel/polyfill for redux/saga in IE
},
output: {
publicPath: 'auto',
filename: "[name].bundle.js",
path: path.resolve(__dirname, "wwwroot", "build"),
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: "babel-loader",
},
{
test: /\.css$/i,
use: ["style-loader", "css-loader"],
},
{
test: /\.(jpe?g|png|gif|woff|woff2|eot|ttf|svg)(\?[a-z0-9=.]+)?$/,
use: [{
loader: "url-loader",
options: {
limit: 100000,
}
}],
type: 'javascript/auto',
},
{
// Expose jquery so that it is possible to use jquery in client that is
// extended by plugins, for example bootstrap-select
test: require.resolve("jquery"),
loader: "expose-loader",
options: {
exposes: ["$", "jQuery"],
},
},
// Expose jquery so that it is possible to use jquery in client that is
// extended by plugins, for example bootstrap-select
{
test: /jquery\..*\.js/,
use: "imports?$=jquery,jQuery=jquery,this=>window",
},
],
},
resolve: {
extensions: [".js", ".jsx"],
alias: {
//........//
},
},
};
.dev.js
const { merge } = require("webpack-merge");
const common = require("./webpack.common.js");
const path = require("path");
module.exports = merge(common, {
mode: "development",
devtool: "eval-source-map",
devServer: {
contentBase: path.join(__dirname, "./build"),
historyApiFallback: true,
},
});
解决方案
仅供参考,通过添加禁用 url() 解析的内容解决了 css 文件不解析 url() 的问题:
options: {
url: false,
},
最终结果:
{
test: /\.css$/i,
use: ["style-loader", {
loader: "css-loader",
options: {
url: false,
},
}],
},
你可以在这里阅读: https ://webpack.js.org/loaders/css-loader/#boolean
options misses the property 'exposes'.
更新expose-loader时仍然存在问题 ......
编辑:我们在代码库中有这样的内联暴露:
import "expose-loader?moment!moment";
改为:
import $ from "expose-loader?exposes=moment!moment";
非常感谢“alexander-akait”帮助我解决了这个问题: https ://github.com/webpack-contrib/expose-loader/issues/129
推荐阅读
- google-bigquery - BigQuery 中的映射(动态键)
- java - Spring忽略类加载器
- android - 查询为空时如何从 SearchView (Android) 中关闭键盘?
- flutter - 我想按其值订购我的 Firestore 数据
- mongoose - 具有 .every() 等效项的 Mongoose agreggate
- javascript - 如何从 React 中的类组件访问上下文变量?
- postgresql - PostgreSQL 触发函数语法错误帮助请求
- symfony - 如何为我的 Symfony Web 应用程序创建 YAML 配置?(不是捆绑)
- javascript - 使用 AJV 要求某些元素存在于数组中
- python - 暂停递归深度优先搜索