express+react+webpack
原因
最近在写拓海官网的后台web项目,本来是想用webpack-dev-server搭建开发环境服务器的,后来查资料发现,webpack-dev-server没有express+webpack-dev-middleware+webpack-hot-middleware灵活,且第二种方案热更新走的是内存,所以就尝试了使用第二种方案。
搭建好之后,发现第二种方案用起来超级爽,既可以配置webpack,也可以灵活自由的配置express服务器和各个中间件,另外由于我们是多入口的打包(就是每次打包,只打包项目中的一部分,也就是想打包的入口页面),所以使用第二种灵活的方案很适合现有的需求。
详情 首先我们先下载需要的进行配置的第三方外部依赖包,这些第三方外部依赖包的使用和作用会在之后介绍
1 | npm install webpack webpack-cli @babel/cli @babel/core babel-loader @babel/preset-env @babel/preset-react file-loader url-loader core-js style-loader css-loader postcss-loader less-loader less ts-loader extract-text-webpack-plugin@next mini-css-extract-plugin express webpack-dev-middleware webpack-hot-middleware @babel/plugin-transform-runtime @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties @babel/runtime-corejs3 @babel/runtime autoprefixer webpack-bundle-analyzer html-webpack-plugin yargs shelljs ora glob cross-env http-proxy-middleware happypack terser-webpack-plugin connect-history-api-fallback --save-dev |
配置babel.config.js编译文件
@babel/preset-env 是babel进行编译es2015语法以上的模块,这里为了兼容更老的浏览器,比如说IE8,使用了core-js模块注入到入口处,属性按需加载@babel/runtime-corejs3模块:core-js第三版本
@babel/preset-react 是babel进行编译react jsx语法的模块
@babel/plugin-proposal-decorators 是babel进行编译 @xxx 这种装饰器的模块
@babel/plugin-proposal-class-properties 是babel进行编译 类似于js变量类型规范,比如prop-types这种第三方外部依赖包的模块
1 | const config = { |
配置多入口部分页面打包、压缩、缓存和消除所有注释
yargs 此模块用于传递命令行传递参数,不是以{key: ‘value’}对象的这种结构,而是使用数组的数据结构,将外部的参数以字符串的形式来传递
ora 此模块使输出的命令行更有活力更有色彩更有仪式感,比如说ora().file(‘error’),如果执行到这一句,命令行就会输出 ✖ error
glob 此模块将所有查到的文件以数组的数据结构,在回调函数里面呈现出来,回调函数的第一个参数err,如果找不到文件等其他错误,就会报错;第二个参数files,就是查到的文件数组
shelljs 此模块在js文件中,使用此模块,可以在js语法中,使用命令行命令
1 | const yargs = require('yargs'), |
配置webpack打包开发环境
path 该nodejs模块用于路径导航和路径拼接等功能
terser-webpack-plugin 该模块用于对js es2015语法的代码的压缩
html-webpack-plugin 该模块以某一个模版引擎或者是超文本传输协议文件作为基准进行处理,将提取出来的模块(js,css,image…)等其他资源注入到其模板中
happypack 该模块能够提高打包和编译的速度,使用多进程进行编译和打包,将主进程分为指定的多个分进程,当输出编译的打包时,会将多个分进程合并为一个主进程
webpack-hot-middleware 该模块可以对开发环境进行资源热加载,当项目中的文件内容发生变化时,资源热加载就会生效,引起开发环境服务器的重新刷新
webpack-bundle-analyzer 该模块可以查看打包之后各个入口模块资源的大小、体积、名称以及打包压缩之后的所有的特征
对于开发环境的css和less等样式文件的编译、打包、缓存以及压缩,本人不推荐使用extract-text-webpack-plugin和mini-css-extract-plugin,如果进行对css和less等样式文件进行抽取,当样式文件发生改变时,查找了好多资料,也使用了很多方法,比如css-hot-loader,都不会引起资源热加载,后来发现人家是有注释的: MiniCssExtractPlugin doesn’t support HMR;For developing, use ‘style-loader’ instead.

说明在开发环境,mini-css-extract-plugin修改样式文件,没办法引起资源热加载.所以我们在开发环境还是使用style-loader,而在预发和生产环境使用MiniCssExtractPlugin或者ExtractTextWebpackPlugin
1 | const path = require('path'), |
PS: url-loader配合happypack,base64图片加载不出来
配置express+webpack-dev-middleware+webpack-hot-middleware开发服务器
express 该模块用于启动nodejs服务器,可以作为路由、请求等处理,具体文档在这儿:express文档
http-proxy-middleware 该模块作为中间件,可以处理代理服务器请求,类似于webpack-dev-server devServer proxy的配置
webpack-dev-middleware 该模块作为中间件,可以处理资源热加载的启动
webpack-hot-middleware 该模块作为中间件,资源热加载的主要处理工具
connect-history-api-fallback 该模块作为中间件,处理404路由页面,重定向至index.html
1 | const express = require('express'), |
配置postcss扩展样式表
autoprefixer 该模块用于css的样式扩展,兼容旧版本浏览器的样式
1 | const autoprefixer = require('autoprefixer'); |
package.json 配置browserslist浏览器兼容以及版本列表
1 |
|
接着,我们要下载安装编写业务代码时的第三方外部依赖包
1 | npm install react react-dom prop-types --save |
之后,我们在每个入口处进行react配置
1 | import React from 'react'; |
最后,我们进行配置index.ejs或者index.html(模板引擎或者超文本传输协议)
1 |
|
我们express+react+webpack方式搭建的web项目就已经完成了,最后的最后给大家展示一下我的目录结构
