技术选型css
webpack 基础html
安装 webpack前端
webpack 简介node
使用webpack-dev-server启动服务器react
配置 React, ES6 & Babel 6webpack
使用 ESlint 进行代码检查git
样式处理es6
图片处理github
区分开发及生产环境web
构建流程图
文件说明
参考
最近在一个项目初步尝试使用了reactJS,开发周期两周,选用的技术栈大体以下:
JavaScript:
Language: ES6
Framework: React, Redux
CSS:
Language: SCSS
Framework: ant-design
Build Tool:
Webpack
Dependency manage
npm
Git workflow:
Gitlab flow
API:
JSON
做为全局变量安装
$ npm install -g webpack $ webpack -v => webpack 1.13.0
做为项目依赖安装
$ npm install webpack --save-dev
entry: 入口,定义要打包的文件
output: 出口,定义打包输出的文件;包括路径,文件名,还可能有运行时的访问路径(publicPath)参数
module: webpack将全部的资源都看作是模块,而模块就须要加载器;主要定义一些loaders,定义哪些后缀名的文件应该用哪些loader
test: 检测哪些文件须要此loader,是一个正则表达式
exclude: 忽略哪些文件
resolve: 定义可以被打包的文件,文件后缀名
plugins: 定义一些额外的插件
处理样式:sass-loader、style-loader、css-loader,将 sass 转成 css
图片处理,url-loader、file-loader、image-webpack-loader, 将图片转换成base64 或者 进行压缩
js处理: babel-loader,babel-preset-es2015,babel-preset-react,将es6或更高级的代码转成es5的代码
代码热替换:HotModuleReplacementPlugin
生成html文件:HtmlWebpackPlugin
报错但不退出webpack进程:NoErrorsPlugin
代码压缩:UglifyJsPlugin
自动打开浏览器: OpenBrowserPlugin
设置环境变量: DefinePlugin
webpack提供的一个静态资源服务器,这个家伙可不太好配置,看官方文档给看懵了,试验了好几回才配成功,后面咱们会根据 NODE_ENV 环境变量分别配置 dev mode server 和 prod mode serve;先来看看其功能:
支持两种模式的自动刷新(Automatic Refresh)
iframe模式
inline模式
支持热更新(Hot Module Replacement)
注: 自动刷新和热更新是两个概念
命令行模式: 命令行模式只须要加上 --line
选项便可
$ webpack-dev-server --line
Node.js API: 使用node.js api须要手动添加配置
var config = { entry: [ 'webpack/hot/dev-server', 'webpack-dev-server/client?http://localhost:8080', path.resolve(__dirname, 'app/index.js') ], }
这是webpack最牛逼的特性之一,即模块热替换,在前端代码变更的时候无需整个刷新页面,只把变化的部分替换掉。使用HMR功能也有两种配置方式:
命令行方式: 命令行模式只须要加上 --line --hot
选项。 --hot
会自动把 webpack/hot/dev-server
加入到了webpack配置文件中的入口点。若是执行正确,能够在浏览器的控制台看到如下信息。
[HMR] Waiting for update signal from WDS... [WDS] Hot Module Replacement enabled.
Node.js API: 手动配置须要作三件事情:
把 webpack/hot/dev-server
加入到webpack配置文件的entry项
把new webpack.HotModuleReplacementPlugin()
加入到webpack配置文件的plugins项
把 hot:true
加入到webpack-dev-server的配置项里面
webpack.config.js: webpack常规配置,配置入口文件,输出文件,loaders等等
server.js: 将server部分分离到一个单独到的文件配置
package.json: 自定义启动命令
<!-- webpack.config.js --> var webpack = require('webpack'); var path = require('path'); var config = { entry: [ path.resolve(__dirname, 'app/index.js') // 定义入口文件 ], output: { // 定义出口目录 path: path.resolve(__dirname, 'build'), filename: 'bundle.js', publicPath: '/' }, resolve: { // resolve 指定能够被 import 的文件后缀 extensions: ['', '.js', '.jsx'] }, module: { }, plugins: [ new webpack.HotModuleReplacementPlugin() ] } module.exports = config;
<!-- server.js --> var webpack = require('webpack'); var webpackDevServer = require('webpack-dev-server'); var config = require('./webpack.config.js'); var compiler = webpack(config); var server = new webpackDevServer(compiler, { historyApiFallback: true, hot: true, inline: true, progress: true, contentBase: './app', stats: { colors: true } }); config.entry.unshift("webpack-dev-server/client?http://localhost:8080/", "webpack/hot/dev-server"); server.listen(8080, "localhost", function(err) { if(err) { console.log(err); } console.log('Listening at localhost:8080...'); });
<!-- package.json --> "scripts": { "start": "node server.js" }
如今你能够经过运行 npm start
启动服务器来。
ES6 和 JSX 转换
在最新的babel 6.x 版本中,在指定哪些代码转换器将被启用时,须要配置 presets
。最简单配置的方法就是项目根目录下建一个 .babelrc
文件:
// .babelrc { "presets": [ "es2015", "react" ] }
配置好以上代码,你就能够开始用 es2015, jsx 了,相关的依赖包
* babel-loader: 转换JSX * babel-core: 即babel的包 * babel-preset-es2015: es2015的babel预设
默认规则包含全部 JSLint、JSHint 中存在的规则,易迁移
规则可配置性高:可设置「警告」、「错误」两个 error 等级,或者直接禁用;
ESLint 支持 JSX, 不过目前为 alpha 版本,正式版发布以前能够先使用 eslint-plugin-react 替代
能够经过如下三种方式配置 ESLint:
使用 .eslintrc
文件(支持 JSON 和 YAML 两种语法)
在 package.json
中添加 eslintConfig 配置块
直接在代码文件中定义
下面主要演示经过 .eslintrc
配置的步骤:
.eslintrc
文件$ touch .eslintrc
{ "parserOptions": { "ecmaVersion": 6, // 指定ECMAScript 版本 "sourceType": "module", // 设置为 "script" (默认) 或 "module"(若是你的代码是 ECMAScript 模块) "ecmaFeatures": { "jsx": true // 启用 JSX } } }
{ "env": { "browser": true, "node": true, "es6": true, "mocha": true } }
"plugins": [ "plugin1", "eslint-plugin-plugin2" ]
{ "rules": { "eqeqeq": "off", "curly": "error", "quotes": ["error", "double"] } }
extends 属性值能够是:
在配置中指定的一个字符串
字符串数组:每一个配置继承它前面的配置
*rules 属性能够作下面的任何事情以扩展(或覆盖)规则:
参数:0 关闭,1 警告,2 错误
启用额外的规则
覆盖基础配置中的规则的默认选项
禁用基础配置中的规则
{ "parserOptions": { //EsLint经过parserOptions,容许指定校验的ecma的版本,及ecma的一些特性 "ecmaVersion": 6, //指定ECMAScript支持的版本,6为ES6 "sourceType": "module", //指定来源的类型,有两种”script”或”module” "ecmaFeatures": { // ecmaFeatures指定你想使用哪些额外的语言特性 "jsx": true //启动JSX } }, "parser": "babel-eslint", // EsLint默认使用esprima作脚本解析,也能够切换成babel-eslint解析 "env": { // Environment能够预设好的其余环境的全局变量,如brower、node环境变量、es6环境变量、mocha环境变量等 "browser": true, "node": true, "es6": true, "mocha": true }, "plugins": [ // EsLint容许使用第三方插件 "react" ], extends: [ // Extends是EsLint默认推荐的验证你可使用配置选择哪些校验是你所须要的 "eslint:recommended" ], rules: [ // 自定义规则 ], "globals": { // 即插件在执行过程当中用到的其它全局变量 } }
经过在项目根目录建立一个 .eslintignore 文件告诉 ESLint 去忽略特定的文件和目录。
SublimeLinter SublimeLinter-contrib-eslint
babel-eslint: ESLint 是前端JS代码检测利器。而 babel-eslint 则容许你检测全部的 Babel 代码
eslint: JavaScript 语法检测利器:分析出你代码潜在的错误和非标准用法
eslint-plugin-react: ESLint 中关于 React 语法检测的插件
编辑器
构建工具
"eslint app
主要使用sass预处理器编写样式,须要先经过sass-loader处理成css,而后再经过css-loader加载成css模块,最后由style-loader加载器对其作最后的处理,从而运行时能够经过style标签将其应用到最终的浏览器环境。
$ npm install css-loader style-loader sass-loader node-sass --save-dev
安装好依赖后,经过如下简单的配置就可使用sass;这里须要注意的一点是须要开启 sourceMap 功能,便于调试。
devtool: "source-map", module: { loaders: [ { test: /(\.css|\.scss)$/, loaders: ["style", "css?sourceMap", "sass?sourceMap"] } ] }
图片处理常见的loader有如下三种:
file-loader: 默认状况下会根据图片生成对应的 MD5 hash 的文件格式
url-loader: url-loader相似于file-loader,可是url-loader能够根据自定义文件大小或者转化为 base64 格式的 dataUrl,或者单独做为文件,也能够自定义对应的 hash 文件名
image-webpack-loader: 提供压缩图片的功能
// url-loader 配置 module: { loaders: [ { test: /\.(jpe?g|png|gif|svg)$/i, loaders: [ 'url?limit=10000&name=img/[hash:8].[name].[ext]', // 图片小于8k就转化为 base64, 或者单独做为文件 'image-webpack' // 图片压缩 ] } ] }
// file-loader 配置 module: { loaders: [ test: /\.(jpe?g|png|gif|svg)$/i, loaders: [ 'file?hash=sha512&digest=hex&name=[hash].[ext]', // 生成 md5 hash 格式的文件名 'image-webpack' // 图片压缩 ] ] }
对于小质量的图片资源,能够由 url-loader 实现将其进行统一打包,代码中 url-loader?limit=8192
的含义就是对于全部小于 8kb 的图片资源转换成base64 格式。这在必定程度上能够替代CSS Sprites方案,用于减小对于小图片资源的HTTP请求数量。
开发环境: 须要日志输出,sourcemap ,错误报告等等
生产环境:须要作代码压缩,对文件名进行 hash 处理等等
为了区分咱们能够建立两个文件分别进行不一样环境下的配置:
webpack.config.dev.js // 开发环境
webpack.config.prod.js // 生产环境
webpack 提供了 DefinePlugin 设置环境变量,后面会根据设置的不一样环境变量决定是否打包压缩,仍是启动dev server 或者是 prod server
plugins: [ ... new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('production') // or development }), ]
判断当前环境是不是生产环境
var isProduction = function () { return process.env.NODE_ENV === 'production'; };
webPack 提供了内建插件,直接配置如下代码便可压缩代码
new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } })
对于没有修改的文件,从缓存中获取文件
对于已经修改的文件,不要从缓存中获取
output: { ... filename: '[chunkhash:8].bundle.js' // chunkhash 默认是16位,可自定义配置 ... },
文件名带上 hash 值后,这个值在每次编译的时候都会发生变化,都须要在 html 文件里手动修改引用的文件名,这种重复工做很琐碎且容易出错,这里咱们可使用 html-webpack-plugin
来帮咱们自动处理这件事情, 用来简化建立服务于 webpack bundle 的 HTML 文件,流程以下:
// 在 app 目录下建一个 index.tpl.html 做为钩子 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> </head> <body> <div id="root"></div> </body> </html>
// 在 webpack.config.dev.js 和 webpack.config.prod.js 添加配置代码,便可生成相对应的 index.html plugins: [ new HtmlWebpackPlugin({ template: 'app/index.tpl.html', inject: 'body', filename: 'index.html' }) ]
npm start
: 启动开发模式下的server
npm run start:prod
: 启动生产模式的server
npm run build
: 打包生产模式的代码
npm run lint
: eslint 代码检查
npm run lint:watch
: eslint 监视
npm run remove:build
: 删除dist目录
npm run clean:build
: 清除dist目录
.babelrc
: 配置 es2015,react 解析器
.eslintrc
: 配置 eslint 代码检查
server.js
: 配置本地 server (包含 dev server 和 prod server )
webpack.config.dev.js
: 开发模式相关配置
webpack.config.prod.js
: 生产模式相关配置