Webpack4+React 项目框架从0到1

一、确定项目技术栈

React 技术栈:react 16、redux、react-router-v4、redux-saga
UI 框架:antd
构建工具:webpack 4

二、webpack 基础配置及相关包的安装

// 初始化 package.json
npm init

// 安装 webpack、webpack-dev-server、webpack-cli
npm i --save-dev webpack webpack-dev-server webpack-cli
// webpack.config.js
module.exports = {
  entry: '',  // 入口文件
  output: {},  // 打包出口文件
  module: {},    // 处理对应模块
  plugin: [],  // 对应的插件
  devServer: {}  // 开发服务器配置
}

基础 Loaders:

// 转义 ES6
npm i babel-core babel-loader babel-preset-env -D
// 转义 react
npm i babel-preset-react -D
// 解析 CSS 样式 loader
npm i style-loader css-loader -D
// 引入 less 文件的话,也需要安装对应的 loader
npm i less less-loader -D
// 处理图片 loader
npm i file-loader url-loader -D
// 页面 img 引用图片
npm i html-withimg-loader -D

基础 Plugins:

// 配置 HTML 模板
npm i html-webpack-plugin -D
// 抽离 CSS
npm i mini-css-extract-plugin -D
// 每次打包之前将dist目录下的文件都清空
npm i clean-webpack-plugin -D

☞ 具体细节配置请参考文章:webpack4-用之初体验,一起敲它十一遍

三、mock 数据

根据后端定义的接口,前端可以自己 mock 数据进行开发,从而使前后端开发更加高效。

mock 数据可以通过两种方式实现:

(1)启动 mock server,配置 devServer 的 target 进行请求转发实现数据 mock(一个好的 mock server 可以用数据模板来模拟大量数据);
(2)通过 devServer 的 bypass 映射到本地 mock 目录(json文件,有一定限制性)。

devServer: {    // 配置此静态文件服务器,可以用来预览打包后项目
    contentBase: path.resolve(__dirname, 'dist'),   // 开发服务运行时的文件根目录
    host: 'localhost',  // 如果想要映射到本机IP,这里改成 '0.0.0.0'
    port: 3000,
    compress: true,  // 开发服务器是否启动gzip等压缩
    proxy: {
            '**/*.action': {
                // target: 'http://127.0.0.1:' + mockport,  // 如果起一个本地 mock 服务的话,可以通过 target 进行请求转发
                bypass: function(req, res, proxyOptions) {
                    if (req.url.indexOf('.action') !== -1) {
                        req.method = 'GET';
                        return '/mock/data' + req.url.replace('.action','.json');
                    }
                }
            }
     }
}

四、区分不同的环境进行构建

一般,我们在构建项目时,会区分开发环境和线上环境:

  • 开发环境是需要方便代码调试的,比如利用 Source Map 映射代码方便调试,或者输出一些提示日志。
  • 线上环境是真正运行项目代码的,需要对代码进行压缩,利用浏览器缓存优化请求等。

有些项目还会区分联调环境和测试环境,比如各个环境的请求地址可能不同,可以根据实际项目进行配置。

let publicPath = '';
if (process.env.NODE_ENV === 'production') {  // 线上环境
  publicPath = 'http://xxx.com';
} else {  // 开发环境
  publicPath = '/dist';
}

webpack4.0打包优化策略(二)

五、利用 webpack 进行优化

1、热模块替换(HMR)

什么叫热模块替换呢?

它其实是利用了 websocket 的原理,当你对代码进行修改并保存后,webpack 将对代码重新打包,并将新的模块发送到浏览器端,浏览器通过新的模块替换老的模块,这样在不刷新浏览器的前提下就能够对应用进行更新,从而减少很多时间,能够帮助我们更加高效的进行开发调试。

要使用它,首先需要开启 HotModuleReplacementPlugin

webpack-dev-server --hot

添加 HMR 有两种方式:

【方案1】:module.hot

if(module.hot) {
  module.hot.accept(App);
}

【方案2】:react-hot-loader

// .babelrc
{
  "plugins": ["react-hot-loader/babel"]
}

// App.js
import React from 'react'
import { hot } from 'react-hot-loader'

const App = () => <div>Hello World!</div>

export default hot(module)(App)

devserver-hot

2、source-map

在开发环境下,开启 source-map,可以方便调试代码。

const config = {
  //...
 devtool: process.env.NODE_ENV === 'production' ? '' : 'source-map'; 
}
3、代码提取

提取公共代码分为两种:一种是所有页面都依赖的基础库,如 react、react-dom 等;一种是业务代码中的公共部分,这样就可以实现浏览器缓存。

前者只要不升级基础库的版本,Hash 值不会被更新,缓存就不会被更新,后者只要缓存了,就可以实现公共页面之间的缓存共享。

webpack4 使用内置 API optimization 代替了 CommonsChunkPlugin,默认会为你生成共享的代码块。

Webpack 日常使用与优化
没有了CommonsChunkPlugin,咱拿什么来分包(译)

4、缓存

一般有两种缓存方式,chunkhash 和版本号。有时候对外的线上项目会采用版本号来进行缓存,而一些内部项目则使用 chunkhash。

缓存 - Webpack 中文文档

五、项目实战

👉 DEMO

webpack4+router4

ps:好气哦,再也不想当webpack配置工程师了 ̄へ ̄

六、参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,326评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,228评论 1 304
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,979评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,489评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,894评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,900评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,075评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,803评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,565评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,778评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,255评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,582评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,254评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,151评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,952评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,035评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,839评论 2 277

推荐阅读更多精彩内容

  • 初始化项目 进入一个文件夹作为项目的根目录 npm init 新建src, dist目录,package.json...
    love_program阅读 1,191评论 0 4
  • GitChat技术杂谈 前言 本文较长,为了节省你的阅读时间,在文前列写作思路如下: 什么是 webpack,它要...
    萧玄辞阅读 12,617评论 7 110
  • 提到微视频,我们最熟悉的莫过于PPT录屏的方式,即事先做好一个PPT课件,然后打开我们的Camtasia录屏软件,...
    信息技术教育应用阅读 4,230评论 0 5
  • 感恩节,我把爸妈的照片翻了翻,也把你的照片翻了翻,奇怪,我还是没有删。 可能有很多我这样的人,我?不信星座,...
    同样的我阅读 97评论 0 0
  • 弱肉强食,在哪里都一样。 当毛克利一直以人孩的躯体遵守狼族的生存法则时,它只能是狼群里最弱小的那一个,身边的亲人也...
    冰清言心阅读 145评论 0 0