使用具有 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
  }
]