导入JSON文件
这里时的WebPack错误是打破了简单的测试案例:导入JSON文件
首先,保存从节点JSON文件:
const fs = require('fs')
let test = {
foo: [
{ 1: 'a'},
{ 2: 'b'}
]
};
fs.writeFileSync('./test.json', JSON.stringify(test), 'utf-8');
然后,尝试导入此JSON到一个js文件是的WebPack处理(我用的是最新版本的WebPack的,3.4.1):
import test from './test.json';
console.log(test);
这失败,出现以下错误:
ERROR in ./test.json
Module build failed: SyntaxError: Unexpected token, expected ; (1:6)
> 1 | {"foo":[{"1":"a"},{"2":"b"}]}
控制台输出指向的冒犯角色是“foo”后面的冒号。
我的WebPack配置很简单,只有这些module
选项:
module: {
rules: [
{
test: /\.js/,
exclude: [ path.resolve(__dirname, 'node_modules') ],
loader: 'babel-loader'
},
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: "css-loader"
})
}
]
},
困惑,我打开了JSON加载页面,告诉我说:
Since webpack >= v2.0.0, importing of JSON files will work by default.
由于我使用的WebPack v。3.4.1,我认为json-loader是不必要的。尽管如此,出于绝望,我增加了以下规则的WebPack配置的模块领域:
{
test: /\.json/,
loader: 'json-loader'
}
这其实工作! json文件被加载,错误消失。
所以我的问题是:是我做错了Webpack试图导入json文件,或者是最新的Webpack莫名关于导入json文件?
您用于.js
规则的正则表达式也匹配.json
,因为您正在查找的所有路径都是.js
。下面的一切会匹配成功(其中大部分是不太可能被进口,甚至存在):
file.js
file.json
file.js.backup
.js/file.css
.jshintrc
test.json
正则表达式,这意味着你申请babel-loader
它匹配。 Babel只接受JavaScript,JSON将无法解析。它抱怨冒号的原因是(:
)是因为在ES6中,你可以用大括号创建一个新的作用域。例如:
const msg = "Outer";
// Entering new scope
{
// msg is free in this scope, shadows the outer one.
const msg = "Inner";
console.log(msg); // Inner
}
// Exiting scope
console.log(msg); // Outer
// SyntaxError: Identifier 'msg' has already been declared
const msg = "Re-definition";
我不认为有在JavaScript中的这许多用途,但它在其他语言中使用了很多(例如Rust)。 JSON的开头大括号启动了一个新的作用域,而不是一个对象,冒号在JavaScript中的一个字符串后无效。
要不适,你只需要在路径的末尾匹配.js
,通过使用$
锚(字符串的结尾),比如你用.css
规则做babel-loader
到.json
文件。
{
test: /\.js$/,
exclude: [ path.resolve(__dirname, 'node_modules') ],
loader: 'babel-loader'
},
哎唷!如此愚蠢的做我的正则表达式错误!当然你是对的 - 当我修正正则表达式时,错误消失了。感谢您的奇妙详细的答案! – azangru