前言:vue有vue-cli
,react也有create-react-app
。花了点时间本身用webpack实现配置react开发环境
"dependencies": { "babel-polyfill": "^6.26.0", "react": "^16.2.0", "react-dom": "^16.2.0", "react-router-dom": "^4.2.2" }, "devDependencies": { "babel-cli": "^6.26.0", "babel-core": "^6.26.0", "babel-loader": "^7.1.2", "babel-preset-es2015": "^6.24.1", "babel-preset-react": "^6.24.1", "clean-webpack-plugin": "^0.1.17", "css-loader": "^0.28.7", "express": "^4.16.2", "file-loader": "^1.1.6", "html-webpack-plugin": "^2.30.1", "node-sass": "^4.7.2", "react-hot-loader": "^3.1.3", "sass-loader": "^6.0.6", "style-loader": "^0.19.1", "uglifyjs-webpack-plugin": "^1.1.5", "webpack": "^3.10.0", "webpack-dev-middleware": "^2.0.3", "webpack-hot-middleware": "^2.21.0", "webpack-merge": "^4.1.1" }
npm init //会生成一个package.json
react: ^16.2.0
react-dom: ^16.2.0
react-router-dom:^4.2.2
css
npm install react react-dom react-router-dom babel-polyfill --save // babel-polyfill用来支持es6语法
webpack: ^3.10.0
html
npm install webpack --save-dev
webpack.config.js
,若是在命令行直接使用webpack
(不指定参数),默认就是打包这个文件,大体结构以下:var path = require('path') module.exports = { //入口 entry:'./src/main.js' // 出口 output: { publicPath: '/', path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, // 模块解析 module: {}, // 插件 plugins:[] }
src目录下的main.js
做为入口打包进dist目录下的bundle.js
,而后在页面引用这个js就能够了babel转码
,热更新
,调试
等,打包时成生产环境代码还须要压缩
,分离第三方库
等功能。npm install babel-cli babel-core babel-loader babel-preset-es2015 babel-preset-react --save-dev //安装react,es6转码过程当中须要的依赖
.babelrc
文件//babel的配置文件 { "presets": [ [ "es2015", { "modules": false } ], "react" ], "plugins": ["react-hot-loader/babel"] }
.gitignore
文件// 项目提交仓库是忽略的一些代码 .DS_Store node_modules/ dist/ npm-debug.log* yarn-debug.log* yarn-error.log* # Editor directories and files .idea *.suo *.ntvs* *.njsproj *.sln
.editorconfig
//规范编码风格 root = true [*] charset = utf-8 indent_style = space indent_size = 2 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true
webpack
,将开发环境和生产环境分开webpack.base.conf.js
基础文件var path = require('path') module.exports = { // 出口 output: { publicPath: '/', path: path.resolve(__dirname, 'dist'), filename: '[name]-[hash].js' }, // 模块 module: { rules: [{ test: /(\.js|\.jsx)$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['es2015', 'react'] } } }, { test: /\.css$/, use: ['style-loader','css-loader'] }, { test: /\.scss$/, use: ['style-loader','css-loader','sass-loader'] }, { test: /\.(png|svg|jpg|gif)$/, use: ['file-loader'] }, { test: /\.(woff|woff2|eot|ttf|otf)$/, use: ['file-loader'] }] } }
name
+hash
命名这样每次修改代码打包之后名字都会不同,而后引用须要的loader
npm install css-loader style-loader sass-loader node-loader file-loader react-hot-loader --save-dev
test
匹配正则加载须要的loader
,css预处理器使用的scss
(scss能够看作sass的升级),react-hot-loader
是热更新中须要用到的webpack.dev.conf.js
和webpack.prod.conf.js
为开发环境打包和生产环境打包,添加使用过程当中的依赖npm install webpack-dev-middleware webpack-hot-middleware webpack-merge clean-webpack-plugin html-webpack-plugin uglifyjs-webpack-plugin express --save-dev
使用webpack-merge
继承webpack.base.conf.js
中的配置,再单独配置(详细直接看代码)
咱们将本身的代码、第三方库、转码用到的babel-polyfill分开打包,这样再根据[name]-[hash].js
打包出三个文件vue
plugins
中加入webpack.optimize.CommonsChunkPlugin()
将第三方库配置为公共代码(公共代码加载页面时会先引用)HtmlWebpackPlugin
配置,配置项目打包时引用的模板,咱们通常在根目录下建议一个index.html
的页面UglifyJsPlugin
用来压缩代码CleanWebpackPlugin
配置,每次打包时先清空HotModuleReplacementPlugin
和NoEmitOnErrorsPlugin
分别为热更新使用和打包出现错误不会退出dev开发环境
比prod生产环境
配置的入口文件中多了两行,是为了开发环境中热更新
配置的entry: { app: [ + 'webpack-hot-middleware/client?reload=true', + 'webpack/hot/only-dev-server', './src/main.js' ], 'babel-polyfill': 'babel-polyfill', vendors: ['react', 'react-dom', 'react-router-dom'] }
webpack
有个webpack-dev-server
,至关于webpack本身加的服务器,能够本身去研究下,我开始没用起来,仍是选择了expressbuild
文件夹下新建一个dev.server.js
文件,而后给开发环境配置服务器,引用webpack-dev-middleware
和webpack-hot-middleware
配置自动打包和自动刷新页面,具体的在代码中也有相应注释,更多参数配置能够看官方文档webpack
打包的是webpack.config.js
文件,如今咱们改写了,就在package.json
中配置一个"scripts": { "test": "echo \"Error: no test specified\" && exit 1", + "build": "webpack --config webpack.prod.conf.js", + "dev": "node build/dev-server.js" }
npm run build //使用生产环境打包 npm run dev //启动开发环境调试,当代码发生更改会自动刷新页面
有问题欢迎交流 demo地址