Webpack:通过文件加载器复制 JSON 文件

mis*_*nic 7 javascript json webpack

我正在使用 Webpack module.loaders,并file-loader在编译时复制几个 js 文件:

module.loaders = [
    { test: /app\/locale\/moment\/.*\.js$/, loader: "file-loader?name=locale/moment/[name].[ext]" }
];
Run Code Online (Sandbox Code Playgroud)

这对我来说效果很好。
我想对 JSON 文件做同样的事情:

module.loaders = [
    { test: /app\/locale\/.*\.json$/, loader: "file-loader?name=locale/[name].[ext]" }
];
Run Code Online (Sandbox Code Playgroud)

但这一次它什么也没做。
为什么 Webpack 在使用文件加载器时会区分 js 文件和 json 文件?

ala*_*lan 4

这是我的答案的改编这是我对我自己的类似问题的

您可以通过文件加载器复制 JSON 文件,方法是将以下代码添加到 Webpack 配置中:

module: {                                                                    
    rules: [  
    // ...  
    {                                                                        
       test: /\.json$/,                                                       
       loader: 'file-loader?name=[name].json'                                 
    }
    // ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

这里有两个细微差别:1)文件加载器只会复制代码中某处导入/需要的文件,2)文件加载器发出文件加载位置的路径,而不是文件本身的内容。

因此,要复制 JSON 文件,您首先需要导入它,例如:

const configFile = require('../config.json');
Run Code Online (Sandbox Code Playgroud)

由于文件加载器发出文件加载器所在位置的路径,因此configFile具有值"/config.json"

现在可以按照您喜欢的方式加载 JSON 文件的内容,例如使用jsonfile

jsonfile.readFile(configFile, function(err, obj) {
    console.log(obj);
});
Run Code Online (Sandbox Code Playgroud)

或者使用 Angular 的HTTP

http.get(configFile).map(res => res.json()).catch((error: any): any => {
    // ...
}).subscribe(obj => {
    console.log(obj);
});
Run Code Online (Sandbox Code Playgroud)