Eri*_*een 6 nginx reactjs webpack webpack-file-loader webpack-4
使用 Webpack 4 以及 url-loader 或 file-loader 时,图像不会在浏览器中加载。小图像不在数据 URL 中(或者如果是,浏览器不会显示它们),并且文件加载器不会发出文件网络请求。
Nginx 在 处正确提供图像https://{server}/images/image_name.png,但没有https://{server},并且在 Web 检查器网络面板中没有对图像进行网络调用。
到目前为止最好的猜测是 Webpack url-loader 或 file-loader 一定不会生成正确的 URL。在 app.bundle.js 中搜索 url 时找不到主机。我已经尝试了几天所有其他 stackoverflow 帖子中的 、 等publicPath组合,但没有任何效果。outputPath
除了搜索js之外,还有什么方法可以查看webpack生成的url吗?是不是webpack配置不正确?故障排除建议?
这是我在代码中处理图像的方法:
import nav_logo from "Images/white_nav_logo.svg";
<img src={nav_logo} />
Run Code Online (Sandbox Code Playgroud)
这是我的 webpack.common.js:
module.exports = {
mode: mode,
entry: {
app: ["./src/js/app.js"]
},
output: {
path: path.resolve(__dirname, "dist"),
filename: '[name].bundle.js',
publicPath: '/',
chunkFilename: '[name].bundle.js'
},
module: {
rules: [
{
test: /\.(sc|c|)ss$/,
issuer: {
exclude: /\.less$/,
},
use: [
{
loader: 'style-loader',
options: {
},
},
{
loader: 'css-loader',
options: {
importLoaders: 1,
localIdentName: '[name]-[local]-[hash:base64:5]',
},
},
],
},
{
test: /\.less$/,
use: [
{
loader: 'style-loader',
},
{
loader: 'css-loader',
options: {
importLoaders: 1,
},
},
],
},
{
test: /\.(jsx?)/,
exclude: ["/node_modules", "/src/js/elm"],
use: [
{ loader: "babel-loader?cacheDirectory=true",
}
]
},
{
test: /\.scss$/,
issuer: /\.less$/,
use: {
loader: './src/js/sassVarsToLess.js'
}
},
{
test: /\.(jpe?g|png|gif|svg)$/i,
use: [
{
loader: 'url-loader',
options: {
limit: 10000,
name: 'images/[name].[ext]',
}
},
{
loader: "image-webpack-loader",
options: {
disable: true,
mozjpeg: {
progressive: true,
quality: 65
},
// optipng.enabled: false will disable optipng
optipng: {
enabled: true,
},
pngquant: {
quality: '65-90',
speed: 4
},
gifsicle: {
interlaced: false,
},
// the webp option will enable WEBP
webp: {
quality: 75
}
}
},
],
},
{
test: /\.(ttf|otf|eot|woff2?)$/,
loader: "file-loader",
options: {
name: 'fonts/[name].[ext]',
}
}
],
noParse: [/\.elm$/]
},
node: {
fs: 'empty'
},
plugins: [
new Dotenv(),
new CopyWebpackPlugin([{
from: "./src/assets/css",
to: "css"
},
]),
]
};
Run Code Online (Sandbox Code Playgroud)
和 webpack.prod.js
module.exports = merge(common, {
mode: 'production',
module: {
rules: [
{
test: /\.(sc|c|)ss$/,
issuer: {
exclude: /\.less$/,
},
use: [
{
loader: MiniCssExtractPlugin.loader,
},
{
loader: 'css-loader',
options: {
importLoaders: 1,
localIdentName: '[name]-[local]-[hash:base64:5]',
},
},
],
},
{
test: /\.less$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
},
{
loader: 'css-loader',
options: {
importLoaders: 1,
}
},
],
},
{
test: /\.(jsx?)/,
exclude: ["/node_modules", "/src/js/elm"],
use: [
{ loader: "babel-loader?cacheDirectory=true",
}
]
},
{
test: /\.scss$/,
issuer: /\.less$/,
use: {
loader: './src/js/sassVarsToLess.js' // Change path if necessary
}
},
{
test: /\.(jpe?g|png|gif|svg)$/i,
use: [
{
loader: 'url-loader',
options: {
limit: 10000,
name: 'images/[name]-[hash:8].[ext]'
}
},
{
loader: "image-webpack-loader",
options: {
disable: false,
mozjpeg: {
progressive: true,
quality: 65
},
// optipng.enabled: false will disable optipng
optipng: {
enabled: true,
},
pngquant: {
quality: '65-90',
speed: 4
},
gifsicle: {
interlaced: false,
},
// the webp option will enable WEBP
webp: {
quality: 75
}
}
},
],
},
{
test: /\.(ttf|otf|eot|woff2?)$/,
loader: "file-loader",
options: {
name: 'fonts/[name].[ext]',
}
}
],
noParse: [/\.elm$/]
},
optimization: {
minimizer: [new TerserJSPlugin(), new OptimizeCSSAssetsPlugin({})]
},
plugins: [
new HtmlWebpackPlugin({
template: './src/assets/prod.index.html'
}),
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css',
}),
],
})
Run Code Online (Sandbox Code Playgroud)
这是 nginx default.conf
server {
listen 80;
server_name <domain_name>;
root /usr/share/nginx/html;
access_log /var/log/nginx/host.access.log main;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location /images/ {
alias /usr/share/nginx/html/images/;
try_files $uri $uri/ =404;
error_log /var/log/nginx/error.log debug;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 3
使用 url-loader 加载图像
如果你注意到里面config/webpack.config.js
有一个里面module object有rules object。对于提供的规则或规则列表有限制键
限制键非常重要
限制值的意义
- 如果要加载的图像大小大于提供的限制值,则默认使用文件加载器。例如,如果我有以下webpack.config.js配置
{
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
loader: require.resolve('url-loader'),
options: {
limit: 10000,
name: 'static/media/[name].[hash:8].[ext]',
},
},
Run Code Online (Sandbox Code Playgroud)
在我里面moudules -> rules object
高于限制值是 10000 字节,因此 webpack 将仅使用 url-loader 加载那些大小小于 10000 字节的图像,如果发现图像大小等于或大于 10000,则默认使用 file-loader 直到不使用后备加载器指定的。
因此,假设您要在代码中动态添加类似这样的图像。
import largeimage from '../static/images/largeimage.jpg'或任何路径且大小largeimage小于图像将不会加载的限制值。
解决方案
对于使用 url-loader 加载图像的 webpack,您的大图像大小应小于限制值。
因此,要么增加限制,要么减小图像大小。
参考 https://webpack.js.org/loaders/url-loader/#limit
| 归档时间: |
|
| 查看次数: |
19770 次 |
| 最近记录: |