使用具有 ES6 语法的文件作为 Webpack 入口点时解析失败
Parse Failure When Using File with ES6 Syntax as Webpack Entry Point
我正在尝试使用 Webpack 转译一些使用 ES6 语法和 JSX 编写的源文件。但是,当我 运行 Webpack 命令时,出现以下错误。
ERROR in ./app/App.jsx
Module parse failed: ./app/App.jsx Line 5: Unexpected token
You may need an appropriate loader to handle this file type.
| 'use strict';
|
| import React from 'react';
| import { RouteHandler } from 'react-router';
|
@ multi main
正如您将在下面看到的,我使用的是 babel-loader,但在我看来加载器无法处理 'import' 语法。知道为什么会这样吗?
下面是我们的基本文件结构。
--/app
----/components
------/shared
--------NavigationBar.js
----App.jsx
--webpack.config.js
--package.json
这是我们的 package.json 文件。
// package.json
{
"scripts": {
"start": "webpack-dev-server --hot --inline",
},
"devDependencies": {
"babel-core": "^6.2.1",
"babel-loader": "^6.2.0",
"react-hot-loader": "^1.3.0",
"webpack": "^1.12.6",
"webpack-dev-server": "^1.12.1"
},
"dependencies": {
"history": "^1.13.1",
"react": "^0.14.3",
"react-dom": "^0.14.3",
"react-router": "^1.0.0"
}
}
这是我们的 webpack.config.js 文件。
// webpack.config.js
module.exports = {
context: __dirname + '/app',
entry: './App.jsx',
output: {
filename: 'app.js',
path: __dirname + '/dist',
},
module: {
loaders: [
{
test: /\.js?$/,
loaders: ['react-hot', 'babel'],
exclude: /node_modules/
}
]
},
resolve: {
extensions: ['', '.js', '.jsx']
},
};
最后,这里是 /app/App.jsx
// App.jsx
'use strict';
import React from 'react';
import { RouteHandler } from 'react-router';
import NavigationBar from './components/shared/NavigationBar';
class App extends React.Component {
render() {
return (
<div>
<NavigationBar />
<RouteHandler />
</div>
);
}
}
export default App;
如果您需要更多信息来诊断问题,请告诉我。在此先感谢您的帮助。
从 Babel 6 开始,您需要手动声明预设,检查 this。
基本上,在您项目的根目录中,您需要一个包含以下内容的 .babelrc
:
{
"presets": [ "es2015", "react" ]
}
以及package.json中对应的npm模块:
// package.json
{
"scripts": {
"start": "webpack-dev-server --hot --inline",
},
"devDependencies": {
"babel-core": "^6.2.1",
"babel-loader": "^6.2.0",
"babel-preset-es2015": "^6.1.18",
"babel-preset-react": "^6.1.18",
"react-hot-loader": "^1.3.0",
"webpack": "^1.12.6",
"webpack-dev-server": "^1.12.1"
},
"dependencies": {
"history": "^1.13.1",
"react": "^0.14.3",
"react-dom": "^0.14.3",
"react-router": "^1.0.0"
}
}
我也为此撞了一阵子!我的问题最终是相似的。我正在使用的 JS 文件 实际上 没有被 webpack 拾取。
在我的例子中,我在一个我没有告诉 webpack 的新源目录中进行开发。为了告诉它,我只需要在我的 Babel-ified JS 加载器配置的 include
键中添加另一个条目。
loaders: [
{
test: /\.js$/,
loaders: ['babel?' + JSON.stringify({
plugins: ['transform-runtime', 'transform-decorators-legacy'],
presets: ['es2015', 'stage-0', 'react'],
})],
include: [
path.join(__dirname, 'src'),
path.join(__dirname, 'another_source_directory')], // <-- this
}
]
我正在尝试使用 Webpack 转译一些使用 ES6 语法和 JSX 编写的源文件。但是,当我 运行 Webpack 命令时,出现以下错误。
ERROR in ./app/App.jsx
Module parse failed: ./app/App.jsx Line 5: Unexpected token
You may need an appropriate loader to handle this file type.
| 'use strict';
|
| import React from 'react';
| import { RouteHandler } from 'react-router';
|
@ multi main
正如您将在下面看到的,我使用的是 babel-loader,但在我看来加载器无法处理 'import' 语法。知道为什么会这样吗?
下面是我们的基本文件结构。
--/app
----/components
------/shared
--------NavigationBar.js
----App.jsx
--webpack.config.js
--package.json
这是我们的 package.json 文件。
// package.json
{
"scripts": {
"start": "webpack-dev-server --hot --inline",
},
"devDependencies": {
"babel-core": "^6.2.1",
"babel-loader": "^6.2.0",
"react-hot-loader": "^1.3.0",
"webpack": "^1.12.6",
"webpack-dev-server": "^1.12.1"
},
"dependencies": {
"history": "^1.13.1",
"react": "^0.14.3",
"react-dom": "^0.14.3",
"react-router": "^1.0.0"
}
}
这是我们的 webpack.config.js 文件。
// webpack.config.js
module.exports = {
context: __dirname + '/app',
entry: './App.jsx',
output: {
filename: 'app.js',
path: __dirname + '/dist',
},
module: {
loaders: [
{
test: /\.js?$/,
loaders: ['react-hot', 'babel'],
exclude: /node_modules/
}
]
},
resolve: {
extensions: ['', '.js', '.jsx']
},
};
最后,这里是 /app/App.jsx
// App.jsx
'use strict';
import React from 'react';
import { RouteHandler } from 'react-router';
import NavigationBar from './components/shared/NavigationBar';
class App extends React.Component {
render() {
return (
<div>
<NavigationBar />
<RouteHandler />
</div>
);
}
}
export default App;
如果您需要更多信息来诊断问题,请告诉我。在此先感谢您的帮助。
从 Babel 6 开始,您需要手动声明预设,检查 this。
基本上,在您项目的根目录中,您需要一个包含以下内容的 .babelrc
:
{
"presets": [ "es2015", "react" ]
}
以及package.json中对应的npm模块:
// package.json
{
"scripts": {
"start": "webpack-dev-server --hot --inline",
},
"devDependencies": {
"babel-core": "^6.2.1",
"babel-loader": "^6.2.0",
"babel-preset-es2015": "^6.1.18",
"babel-preset-react": "^6.1.18",
"react-hot-loader": "^1.3.0",
"webpack": "^1.12.6",
"webpack-dev-server": "^1.12.1"
},
"dependencies": {
"history": "^1.13.1",
"react": "^0.14.3",
"react-dom": "^0.14.3",
"react-router": "^1.0.0"
}
}
我也为此撞了一阵子!我的问题最终是相似的。我正在使用的 JS 文件 实际上 没有被 webpack 拾取。
在我的例子中,我在一个我没有告诉 webpack 的新源目录中进行开发。为了告诉它,我只需要在我的 Babel-ified JS 加载器配置的 include
键中添加另一个条目。
loaders: [
{
test: /\.js$/,
loaders: ['babel?' + JSON.stringify({
plugins: ['transform-runtime', 'transform-decorators-legacy'],
presets: ['es2015', 'stage-0', 'react'],
})],
include: [
path.join(__dirname, 'src'),
path.join(__dirname, 'another_source_directory')], // <-- this
}
]