2017-04-14 111 views
-1

我试图用webpack和babel构建reactjs应用程序。为什么webpack不喜欢这个表达

我开始这个应用程序从反应启动器与react-scripts build以前工作。但是,这是一个黑盒子,并没有真正提供我需要的所有功能,特别是当涉及到一个模块不喜欢UglifyJS时。

webpack.config.js看起来是这样的,这是非常简单的:

var path = require('path'); 
var webpack = require('webpack'); 

var BUILD_DIR = path.resolve(__dirname, 'build_webpack'); 
var APP_DIR = path.resolve(__dirname, 'src'); 

module.exports = { 
    entry: APP_DIR + '/index.js', 
    output: { 
    path: BUILD_DIR, 
    filename: 'bundle.js' 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /.jsx?$/, 
     exclude: /node_modules/, 
     loader: 'babel' 
     }, 
     { 
     test: /\.css$/, 
     loader: "style-loader!css-loader" 
     } 
    ] 
    } 
} 

,我有这个配置在我package.js

"scripts": { 
     "start": "react-scripts start", 
     "reactbuild": "react-scripts build", 
     "webpackbuild": "webpack --watch", 
     "test": "react-scripts test --env=jsdom", 
     "eject": "react-scripts eject" 
     } 

而且我.babelrc文件只有这个:

{ 
    "presets" : ["es2015", "es2016", "react"] 
} 

但是,在中工作的代码这里失败,错误输出表示:在./src/Pages/SearchTool/SearchResult.js

ERROR 模块构建失败:语法错误:意外的令牌(100:13)

(错误被参考到数据输入参数)

renderChip = (data) => { 
     return (
      <Chip 
      key={data.key} 

我真的不明白这个表达式有什么特别之处。我不认为这是很常用的,但应该是合法的。另外,我切换到webpack的一个原因是以前的反应版本不像es6,但是我的一个重要的模块是用es6编写的。

我不知道我的配置或其他地方丢失了什么。感谢所有的帮助!

编辑:

我package.js:

{ 
    "name": "myCoolApps", 
    "version": "0.1.0", 
    "private": true, 
    "devDependencies": { 
    "css-loader": "^0.26.1", 
    "react-scripts": "0.7.0", 
    "webpack": "^1.13.3" 
    }, 
    "dependencies": { 
    "ace": "git+https://github.com/ajaxorg/ace.git#master", 
    "antd": "^2.7.2", 
    "axios": "^0.15.3", 
    "babel-core": "^6.24.1", 
    "babel-loader": "^6.4.1", 
    "babel-preset-env": "^1.4.0", 
    "babel-preset-es2015": "^6.24.1", 
    "babel-preset-es2016": "^6.24.1", 
    "babel-preset-react": "^6.24.1", 
    "card": "^2.2.1", 
    "card-react": "^1.2.6", 
    "chat-template": "0.0.22", 
    "codemirror": "^5.25.0", 
    "credit-card-type": "^5.0.1", 
    "css-loader": "^0.26.1", 
    "d3": "^4.7.4", 
    "firechat": "^3.0.1", 
    "firepad": "^1.4.0", 
    "flux": "^3.1.0", 
    "gulp": "^3.9.1", 
    "gulp-sass": "^3.1.0", 
    "history": "^1.17.0", 
    "little-loader": "^0.2.0", 
    "lodash": "^4.17.4", 
    "material-ui": "^0.16.6", 
    "moment": "^2.17.1", 
    "node-sass": "^4.5.0", 
    "quill": "^1.2.3", 
    "rc-calendar": "^7.6.5", 
    "react": "^15.5.4", 
    "react-autosuggest": "^7.0.1", 
    "react-cookie": "^1.0.4", 
    "react-credit-card": "^0.20.0", 
    "react-dom": "^15.5.4", 
    "react-dropzone": "^3.8.0", 
    "react-event-timeline": "^1.2.2", 
    "react-infinite": "^0.10.0", 
    "react-infinite-scroller": "^1.0.7", 
    "react-list": "^0.8.3", 
    "react-notification-system": "^0.2.12", 
    "react-router": "^3.0.0", 
    "react-tap-event-plugin": "^2.0.1", 
    "seedrandom": "^2.4.2", 
    "simplewebrtc": "^2.2.2", 
    "style-loader": "^0.13.1", 
    "superagent": "^3.3.1", 
    "webpack": "^1.15.0", 
    "y-array": "^10.0.6", 
    "y-indexeddb": "^8.1.9", 
    "y-leveldb": "0.0.1", 
    "y-map": "^10.0.5", 
    "y-memory": "^8.0.8", 
    "y-richtext": "^9.0.8", 
    "y-text": "^9.3.2", 
    "y-webrtc": "^8.0.7", 
    "y-websockets-client": "^8.0.15", 
    "yjs": "^12.1.7" 
    }, 
    "scripts": { 
    "start": "react-scripts start", 
    "reactbuild": "react-scripts build", 
    "webpackbuild": "webpack", 
    "test": "react-scripts test --env=jsdom", 
    "eject": "react-scripts eject" 
    } 
} 

UPDATE:

我试过ENV预设的,现在我的webpack.config.js看起来是这样的:

{ 
    "presets": 
    [ 
    "react", 
    [ 
     "env", 
     { 
     "targets": { 
      "uglify": false, 
      "node": "current", 
      "debug": true, 
     }, 
     } 
    ], 
    ], 
} 

但是,它仍然抱怨这个表达式:

ERROR in ./src/Pages/SearchTool/SearchResult.js 
Module build failed: SyntaxError: Unexpected token (100:13) 

    98 | } 
    99 | 
> 100 | renderChip = (data) => { 
     |   ^
    101 |  return (
    102 |  <Chip 
    103 |   key={data.key} 

@ ./src/Pages/Connections/Connections.js 43:20-57 

功能原本看起来像这样的程序(注:这是一个类中):

renderChip = (data) => { 
    return (
     <Chip 
     key={data.key} 
     onRequestDelete={this.handleRequestDelete} 
     style={{ 
      borderRadius: '6px', 
      margin: '0 4px', 
      height: 35 
     }} 
     > 
     {data.label} 
     </Chip> 
    ); 
    } 

而且我也尝试过包括插件手动

这个功能在我的课看起来像的地方:

class Name extends Component { 
    constructor(props) {...} 

    renderChip = (data) => { 
     return (
      <Chip 
      key={data.key} 
      onRequestDelete={this.handleRequestDelete} 
      style={{ 
       borderRadius: '6px', 
       margin: '0 4px', 
       height: 35 
      }} 
      > 
      {data.label} 
      </Chip> 
     ); 
     } 

    render() {...} 
} 

我手动包含transform-es2015-function-nametransform-es2015-arrow-functions,但他们没有工作。是否有一些其他插件需要手动添加?或者是由其他原因造成的?

解决

解决办法是改变功能的表达研究到:

renderChip() { 
    ... 
} 
+0

什么是您的webpack版本? – loelsonk

+0

它是版本4.4.4 – Jason

+0

我问'webpack'版本,最新是2.4.1。那么你的是什么? – loelsonk

回答

1

请添加babel-preset-env包。

.babelrc应该是这个样子:(["env" ...]部分是这里重要的)

{ 
    "presets": [ 
    ["env", { 
     "targets": { 
     "uglify": true, 
     "node": "current" 
     } 
    }] 
    ] 
} 

阅读我上面提到的文档。 UglifyJS不支持ES6。建议使用babel-minify代替。

UglifyJS does not currently support any ES6 syntax, so if you are using Uglify to minify your code, targeting later browsers may cause Uglify to throw syntax errors.

To prevent these errors - specify the uglify option, which will enable all plugins and, as a result, fully compile your code to ES5. However, the useBuiltIns option will still work as before, and only include the polyfills that your target(s) need.

UPDATE:

尝试安装/重新安装这些程序包。你可能不需要所有这些,但是你稍后可能会用到它们。的

renderChip = (data) => { 
+0

首先感谢您的建议!然而,在这种情况下它并没有真正的工作。它仍在抱怨函数声明表达式。我尝试了几个我在原始文章中更新的东西。 – Jason

+0

我已经更新了我的答案,请安装这些软件包。请更正您的代码。 – loelsonk

+0

有小的编辑,请更新您的代码到'renderChip(data){'让我知道它是否工作。 – loelsonk

1

npm install --save-dev babel-core babel-loader babel-polyfill babel-preset-env babel-register babel-plugin-syntax-dynamic-import babel-plugin-transform-object-rest-spread babel-plugin-transform-regenerator 

renderChip(data) { 

相反,你不能直接在类体声明与赋值操作符类的方法,而不是你可以做以下。

renderChip(data) { 
    return (
     <Chip 
     key={data.key} 
     onRequestDelete={this.handleRequestDelete} 
     style={{ 
      borderRadius: '6px', 
      margin: '0 4px', 
      height: 35 
     }} 
     > 
     {data.label} 
     </Chip> 
    ); 
    } 

你可以阅读关于ES6类here

希望这有助于!

+0

我认为你是对的。但是,这在我的开发构建和react-script构建中起作用。这是一个es5标准吗?如果是这样,是否有办法设置我的构建系统,以便我可以处理es5和es6的混合?我按照es6标准做了大部分工作,但这些功能来自我的合伙人,他比我年长许多。 – Jason

+0

您不能在ES5中使用'class',因为基本上它是ES6功能。当然,你可以在你的代码中同时使用ES5和ES6,你只需要添加babel预设来编译ES6到浏览器兼容的代码。正如我在webpack中看到的那样,您已经有了es2015预设(与ES6相同)。 –

+0

阅读关于ES标准https:// benmccormick。org/2015/09/14/es5-es6-es2016-es-next-whats-with-javascript-versioning/ –