我正在构建一个小型Web应用程序,其中要从多个JSON文件加载数据。
import config from './config.json';
import data from './data.json';
console.log(config, data)
对于我的webpack构建,我想从包中排除JSON文件,因为它们很大(可以异步加载)。目前,我正在尝试使用file-loader
来实现这一目标。
const path = require('path');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
devtool: '#cheap-source-map',
resolve: {
modules: ['node_modules']
},
entry: {
main: path.resolve('./index.js')
},
output: {
filename: '[name].bundle.js',
path: path.resolve('./dist')
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader'
},
{
type: 'javascript/auto',
test: /\.json$/,
use: [
{
loader: 'file-loader',
options: {
name: '[name].[ext]'
}
}
]
}
]
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
template: './index.html',
filename: 'index.html',
inject: 'body'
})
]
};
使用此配置,我得到了单独的文件,但它们不会被导入。在这种特殊情况下,console.log()
仅将文件名返回为字符串data.json
和config.json
。似乎实际的JSON文件未加载。
我在做什么错? file-loader
是去这里的方式吗?
答案 0 :(得分:0)
使用file-loader
不会这样做。解决方案是使用SplitChunksPlugin,该软件包自版本4起包含在webpack中。对于较旧的版本,请使用CommonsChunkPlugin。
这是一个有效的webpack.config.json
文件:
const path = require('path');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
devtool: '#cheap-source-map',
resolve: {
modules: ['node_modules']
},
entry: {
main: path.resolve('./index.js')
},
output: {
filename: '[name].bundle.js',
path: path.resolve('./dist')
},
optimization: {
splitChunks: {
chunks: 'all',
minSize: 0,
cacheGroups: {
data: {
test: /\.json$/,
filename: '[name].js',
name(module) {
const filename = module.rawRequest.replace(/^.*[\\/]/, '');
return filename.substring(0, filename.lastIndexOf('.'));
},
}
}
}
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
template: './index.html',
filename: 'index.html',
inject: 'body'
})
]
};
文件被加载到应用程序中(请参见DevTools中的请求),并且console.log(config, data)
输出数组/对象。
但是,此解决方案将JSON文件输出为JavaScript。这对我来说很好用,但是如果您依赖于文件为JSON,则可能会出现问题。简单的config.json示例:
(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[function(n){n.exports={name:"test"}}]]);
如果您对源地图感到不安,则可以将SourceMapDevToolPlugin指定为exclude
规则。