这个问题可能已在其他地方得到解答,但在标记为重复之前,请帮助我。我指的是使用react和d3的以下codepen:https://codepen.io/swizec/pen/oYNvpQ
但是,我无法弄清楚这个codepen如何处理在没有任何关键字的情况下在类中声明的变量:
class Colors extends Component {
colors = d3.schemeCategory20;
width = d3.scaleBand()
.domain(d3.range(20));
....
}
当我尝试执行此代码时,出现以下错误:
./app/components/D3IndentedTree/Chloreophath.js
Module build failed: SyntaxError: Unexpected token (13:11)
11 | // Draws an entire color scale
12 | class Colors extends Component {
> 13 | colors = d3.schemeCategory20;
| ^
14 | width = d3.scaleBand()
15 | .domain(d3.range(20));
16 |
我无法弄清楚为什么会收到此错误。我知道你不能直接在类中声明类的变量/属性。但是,为什么代码笔正在工作?
提前致谢!
更新:添加webpack.config.js文件:
var path = require('path');
var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './app/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'index_bundle.js',
publicPath: '/'
},
module: {
rules: [
{ test: /\.(js)$/, use: 'babel-loader' },
{ test: /\.css$/, use: [ 'style-loader', 'css-loader'] },
{
test: /\.png$/,
loader: "url-loader?limit=100000"
},
{
test: /\.jpg$/,
loader: "file-loader"
},
{
test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/,
loader: 'url-loader? limit=10000&mimetype=application/font-woff'
},
{
test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
loader: 'url-loader?limit=10000&mimetype=application/octet-stream'
},
{
test: /\.eot(\?v=\d+\.\d+\.\d+)?$/,
loader: 'file-loader'
},
{
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
loader: 'url-loader?limit=10000&mimetype=image/svg+xml'
}
]
},
plugins: [new HtmlWebpackPlugin({
template: 'app/index.html'
}),
new webpack.ProvidePlugin({
"React": "react",
}),],
devServer: {
historyApiFallback: true
}
};
答案 0 :(得分:10)
但是,为什么代码笔正在工作?
因为它使用支持Babel的转换器(在这种情况下,that syntax)(目前是第3阶段提案,而不是[尚未]指定的功能,但通常由使用的转换器支持使用React代码)。
您可以看到它正在与Babel进行转换,因为它在JS窗格的标题中的“JS”旁边显示“(Babel)”:
...如果点击旁边的齿轮图标,您会看到Babel被选为“预处理器”。
在这种特殊情况下,Babel采用了这个:
class Colors extends Component {
colors = d3.schemeCategory20;
width = d3.scaleBand()
.domain(d3.range(20));
// ....
}
...并且好像它是这样写的:
class Colors extends Component {
constructor() {
this.colors = d3.schemeCategory20;
this.width = d3.scaleBand()
.domain(d3.range(20));
}
// ....
}
...(然后可能会将其转换为符合ES5的代码,具体取决于转换设置)。