教程完了?
老实说,我以为这个教程会更长,但看起来我忘了“加入 babel”这件事实际上非常简单。现在我们可以使用 ES6 语法来更新先前 index.js 的代码了:
// index.js// 接受 hot module reloading
if (module.hot) {
module.hot.accept()
}
require('./styles.css') // 網頁現在有了樣式
const Please = require('pleasejs')
const div = document.getElementById('color')
const button = document.getElementById('button')
const changeColor = () => div.style.backgroundColor = Please.make_color()
button.addEventListener('click', changeColor)
Require ES6 的 Module
另一件事情,注意到我们現在可以使用 ES6 的 module 系統。例如:
const Please = require('pleasejs')
我们可以修改成
import Please from 'pleasejs'
额外收获
既然前面没花太多时间,我将再讨论两个很重要且有用的主题。
在 Webpack 和 Babel 设定 production 环境变量
Webpack
如果我们不想要在 production 执行部分的代码,我们可以使用方便的 DefinePlugin。
这个 plugin 让我们可以为我们整个 bundle 建立全域的常数,我们可以命名任何常数,像是:DONT_USE_IN_PRODUCTION: true,但是大多普遍的方式会是 process.env.NODE_ENV: JSON.stringify('production'),这会是更好的选择。这是因为许多项目可以识别并根据 process.env.NODE_ENV 来使用额外的功能和优化你的代码。
为什么要 JSON.stringify?因为根据文件的解释:
如果值是一个字串,它会被作为一个代码片段。
这意思说一个 'production' 只会是一个错误。如果你认为 JSON.stringify 很奇怪,一个有效替代方式是 '"production"'。
你的 plugin 阵列现在看起来应该像:
plugins: [ new webpack.optimize.UglifyJsPlugin({
compressor: {
warnings: false,
},
}), new webpack.optimize.OccurrenceOrderPlugin(), new HtmlWebpackPlugin({
template: './src/index.html'
}), new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('production')
})
]
现在,假如我们不想要在 production 上执行一些代码,我们可以放入一个 if 条件式:
if (process.env.NODE_ENV !== 'production') { // not for production}
在我们目前的文档中,如果在 production 环境下,我们可以排除 hot reload:
// 在開發環境下接受 hot module reloading
if (process.env.NODE_ENV !== 'production') {
if (module.hot) {
module.hot.accept()
}
}
Babel
将我们的 production 变量定义为 process.env.NODE_ENV 有其他额外的好处。
根据手册
“目前环境”是使用 process.env.BABEL_ENV。当找不到 BABEL_ENV 时, 它会退回去找 NODE_ENV,如果也找不到 NODE_ENV,目前环境将设为默认值 "development"。
这个意思说 babel 环境会 match 到我们的 webpack 环境。
我们可以利用这一点,只要透过在我们的 .babelrc 加入 env 设定,就可以使用开发环境:
{
"presets": ["es2015", "stage-2"],
"env": {
// 只發生在 NODE_ENV 沒有被定義或是被設定為 'development'
"development": {
// 當 NODE_ENV 是 production 忽略!
}
}
当我们介绍 React Transform HMR,我们将使用这个在 part 3 和 react。
加入 Lint
如果你看过任何关于 Webpack/React 专案的 seed/starter,你可能看过一个文件叫做 .eslintrc。如果你不是使用 IDE,而是使用像是 Atom、Sublime、Ecmas、Vim 等等,eslint 提供语法和风格的检查,指出你的错误。此外,即使你正在使用 IDE,它可以提供更多功能,并确保整个专案程式码风格统一。
请注意,如果你相要在编辑器内使用它,你需要安装一个套件,例如我使用 Atom linter-eslint。
如果要减少我们手动配置,我们可以充分的利用继承,使用他人的配置文件。我喜欢使用基于 airbnb 的风格指南配置文件。
开始之前,我们须安装 eslint 和 airbnb 的配置文件:
npm install -g eslint
npm install --save-dev eslint eslint-config-airbnb
我们的设置文件看起来像
// .eslintrc{
"extends": "airbnb/base" //使用 'airbnb/base' ,因為 'airbnb' 是假設使用 react
}
然而,因为 linting 是非常固执的,我喜欢将它调整一些。如果你想要知道这些规则的含意,或是根据你的喜好调整他们,可以查看这里:
// .eslintrc{
"extends": "airbnb/base",
"rules": {
"comma-dangle": 0,
"no-console": 0,
"semi": [2, "never"],
"func-names": 0,
"space-before-function-paren": 0,
"no-multi-spaces": 0
}
}
另外,eslint 内建不支持和分辨 babel 语法,所以我们需要安装两个套件:
npm install --save-dev babel-eslint eslint-plugin-babel
调整我们的配置文件,再一次的加入 babel 指定规则:
// .eslintrc{
"extends": "airbnb/base",
"parser": "babel-eslint",
"rules": {
"comma-dangle": 0,
"no-console": 0,
"semi": [2, "never"],
"func-names": 0,
"space-before-function-paren": 0,
"no-multi-spaces": 0,
"babel/generator-star-spacing": 1,
"babel/new-cap": 1,
"babel/object-shorthand": 1,
"babel/arrow-parens": 1,
"babel/no-await-in-loop": 1
}, "plugins": [
"babel"
]
}
最后,在我们的 package.json 文件中的 scripts 加入 lint 会是个好主意。
// package.json
"scripts": {
"build": "webpack --config webpack.config.prod.js",
"dev": "webpack-dev-server --config webpack.config.dev.js",
"lint": "eslint src"
}
当你执行 npm run lint 来确保你的代码没有违反你指定的规则。
结论
我已经把所有这一切的最终结果放入到范例一。
所以现在我们可以轻松的编写 ES6 程式码,此外,也让我们了解到如何编写设定档
然而,你有能力从头开始编写它,并不表示你一定要这么做。为了方便,我有建立一个 repository 让你 clone 下来开始,这是根据这份教学建立的基本文件。
转载请注明: Vue教程中文网 - 打造国内领先的vue学习网站-vue视频,vue教程,vue学习,vue培训 » Webpack初学者-使用webpack与babel(二)