Webpack 文件加载器 publicPath
Webpack file-loader publicPath
我有一个反应项目,我在其中使用 webpack 3.10.0 和文件加载器 1.1.6 将一些图像和 json 文件移动到我的分发文件夹中。
Webpack 按预期发出文件,但 React 接收到我的 json 和图像资产
的错误 url
我的标记如下:
<img src="../images/helloworld_a49183cf48e4a0f12aa2124fe2ed9d3a.png"
alt="Hello World!!">
但应该是:
<img src="/assets/images/helloworld_a49183cf48e4a0f12aa2124fe2ed9d3a.png"
alt="Hello World!!">
我的文件夹结构如下所示:
C:.
├───dist
│ └───assets
│ ├───css
│ ├───data
│ ├───images
│ └───js
├───src
│ ├───css
│ ├───data
│ ├───images
│ └───js
│ ├───actions
│ ├───components
│ ├───containers
│ └───reducers
└───tests
我认为 file-loader publicPath 应该处理这个问题,但似乎我误解了或者我的配置有问题。
有好心人帮帮我吗?
webpack.config.js
var path = require('path');
const ExtractCSS = require("extract-text-webpack-plugin");
module.exports = {
entry: [
'./src/js/index.js'
],
output: {
path: path.resolve(__dirname, 'dist/assets/js'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['env','react']
}
}
},
{
test: /\.scss$/,
loader: ExtractCSS.extract('css-loader!sass-loader')
},
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'file-loader',
options: {
name (file) {
/*if (env === 'development') {
return '[path][name].[ext]'
}*/
return '[name]_[hash].[ext]'
},
publicPath: '/assets/images/',
outputPath: '../images/'
}
}
]
},
{
test: /\.json$/,
use: [
{
loader: 'file-loader',
options: {
name (file) {
/*if (env === 'development') {
return '[path][name].[ext]'
}*/
return '[name].[ext]'
},
publicPath: '/assets/data/',
outputPath: '../data/'
}
}
]
}
]
},
plugins: [
new ExtractCSS('../css/app.css', {
allChunks: true
})
],
resolve: {
extensions: ['.js', '.jsx']
},
//devtool: 'eval-source-map',
devServer: {
historyApiFallback: true,
contentBase: './dist/'
}
};
所以,而不是
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'file-loader',
options: {
name (file) {
/*if (env === 'development') {
return '[path][name].[ext]'
}*/
return '[name]_[hash].[ext]'
},
publicPath: '/assets/images/',
outputPath: '../images/'
}
}
]
},
你可以试试
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'file-loader',
options: {
name (file) {
/*if (env === 'development') {
return '[path][name].[ext]'
}*/
return '[name]_[hash].[ext]'
},
publicPath: function(url) {
return url.replace(../, '/assets/')
},
}
}
]
},
您还可以将输出对象配置为更高级别,然后仅指定文件名:
output: {
path: path.resolve(__dirname, 'dist/assets'),
filename: 'js/bundle.js'
},
例如 json:
{
test: /\.json$/,
use: [
{
loader: 'file-loader',
options: {
name: 'data/[name].[ext]',
}
}
]
}
今天早上我的机器重启后,问题变了?!!? (缓存问题??!)...它现在将 publicPath 与 outputPath 连接起来,而不是忽略 publicPath。
与此处解释的问题相同:https://github.com/webpack-contrib/file-loader/issues/228
恢复到 0.10.1 解决了我的问题。
感谢所有试图提供帮助的人!
我有一个反应项目,我在其中使用 webpack 3.10.0 和文件加载器 1.1.6 将一些图像和 json 文件移动到我的分发文件夹中。
Webpack 按预期发出文件,但 React 接收到我的 json 和图像资产
的错误 url我的标记如下:
<img src="../images/helloworld_a49183cf48e4a0f12aa2124fe2ed9d3a.png"
alt="Hello World!!">
但应该是:
<img src="/assets/images/helloworld_a49183cf48e4a0f12aa2124fe2ed9d3a.png"
alt="Hello World!!">
我的文件夹结构如下所示:
C:.
├───dist
│ └───assets
│ ├───css
│ ├───data
│ ├───images
│ └───js
├───src
│ ├───css
│ ├───data
│ ├───images
│ └───js
│ ├───actions
│ ├───components
│ ├───containers
│ └───reducers
└───tests
我认为 file-loader publicPath 应该处理这个问题,但似乎我误解了或者我的配置有问题。 有好心人帮帮我吗?
webpack.config.js
var path = require('path');
const ExtractCSS = require("extract-text-webpack-plugin");
module.exports = {
entry: [
'./src/js/index.js'
],
output: {
path: path.resolve(__dirname, 'dist/assets/js'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['env','react']
}
}
},
{
test: /\.scss$/,
loader: ExtractCSS.extract('css-loader!sass-loader')
},
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'file-loader',
options: {
name (file) {
/*if (env === 'development') {
return '[path][name].[ext]'
}*/
return '[name]_[hash].[ext]'
},
publicPath: '/assets/images/',
outputPath: '../images/'
}
}
]
},
{
test: /\.json$/,
use: [
{
loader: 'file-loader',
options: {
name (file) {
/*if (env === 'development') {
return '[path][name].[ext]'
}*/
return '[name].[ext]'
},
publicPath: '/assets/data/',
outputPath: '../data/'
}
}
]
}
]
},
plugins: [
new ExtractCSS('../css/app.css', {
allChunks: true
})
],
resolve: {
extensions: ['.js', '.jsx']
},
//devtool: 'eval-source-map',
devServer: {
historyApiFallback: true,
contentBase: './dist/'
}
};
所以,而不是
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'file-loader',
options: {
name (file) {
/*if (env === 'development') {
return '[path][name].[ext]'
}*/
return '[name]_[hash].[ext]'
},
publicPath: '/assets/images/',
outputPath: '../images/'
}
}
]
},
你可以试试
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'file-loader',
options: {
name (file) {
/*if (env === 'development') {
return '[path][name].[ext]'
}*/
return '[name]_[hash].[ext]'
},
publicPath: function(url) {
return url.replace(../, '/assets/')
},
}
}
]
},
您还可以将输出对象配置为更高级别,然后仅指定文件名:
output: {
path: path.resolve(__dirname, 'dist/assets'),
filename: 'js/bundle.js'
},
例如 json:
{
test: /\.json$/,
use: [
{
loader: 'file-loader',
options: {
name: 'data/[name].[ext]',
}
}
]
}
今天早上我的机器重启后,问题变了?!!? (缓存问题??!)...它现在将 publicPath 与 outputPath 连接起来,而不是忽略 publicPath。 与此处解释的问题相同:https://github.com/webpack-contrib/file-loader/issues/228
恢复到 0.10.1 解决了我的问题。
感谢所有试图提供帮助的人!