《玩转Webpack》学习笔记 Day3之第二章

161 阅读3分钟

资源解析:解析 React JSX

image.png

安装react-dom 和@babel/preset-react

npm i react react-dom @babel/preset-react -D

资源解析: 解析CSS

先写style-loader,再写css-loader,使用css-loader解析css,解析好的css再传递给style

image.png

安装css-loader和style-loader

npm i style-loader css-loader -D

资源解析: 解析 Less 和 Sass

image.png

安装css-loader和style-loader

npm i less less-loader -D

npm i sass sass-loader -D

资源解析: 解析图片

image.png

安装file-loader

npm i file-loader -D

资源解析: 解析字体

与解析图片差不多

image.png

资源解析: 使用url-loader

image.png

limit单位是字节byte

Webpack 文件监听

⽂件监听是在发现源码发⽣变化时,⾃动重新构建出新的输出⽂件。 
webpack 开启监听模式,有两种⽅式: 
    -     启动 webpack 命令时,带上 --watch 参数 
    -     在配置 webpack.config.js 中设置 watch: true

webpack 中的文件监听使用

image.png

文件监听的原理分析

轮询判断⽂件的最后编辑时间是否变化 某个⽂件发⽣了变化,并不会⽴刻告诉监听者,⽽是先缓存起来,等 aggregateTimeout 一起去构建

 module.export = { //默认 false,也就是不开启 watch: true, 
 //只有开启监听模式时,watchOptions才有意义 
     wathcOptions: { //默认为空,不监听的文件或者文件夹,支持正则匹配 
         ignored: /node_modules/, //监听到变化发生后会等300ms再去执行,默认300ms 
         //判断文件是否发生变化是通过不停询问系统指定文件有没有变化实现的,默认每秒问1000次 
         aggregateTimeout: 300, 
         poll: 1000 
     }
  }

热更新:

webpack-dev-server

WDS 不刷新浏览器; WDS 不输出⽂件,⽽是放在内存中; 使⽤ HotModuleReplacementPlugin插件;

{ 
    "name": "hello-webpack", 
    "version": "1.0.0", 
    "description": "Hello webpack", 
    "main": "index.js", 
    "scripts": { 
                    "build": "webpack ", 
                  + ”dev": "webpack-dev-server --open" //--open更新完成自动开启浏览器
               }, 
    "keywords": [], 
    "author": "", 
    "license": "ISC" 
}

使⽤ webpack-dev-middleware

WDM 将 webpack 输出的⽂件传输给服务器 适⽤于灵活的定制场景

const express = require('express'); 
const webpack = require('webpack'); 
const webpackDevMiddleware = require('webpack-devmiddleware'); 
const app = express(); 
const config = require('./webpack.config.js'); 
const compiler = webpack(config); 
app.use(webpackDevMiddleware(compiler, { publicPath: config.output.publicPath })); app.listen(3000, function () { 
                                    console.log('Example app listening on port 3000!\n'); 
                              }
           )

热更新原理分析

image.png

Webpack Compile:  JS 编译成 
Bundle HMR Server: 将热更新的⽂件输出给 
HMR Rumtime Bundle server: 提供⽂件在浏览器的访问 HMR Rumtime: 会被注⼊到浏览器, 更新⽂件的变化
bundle.js: 构建输出的⽂件

文件指纹

什么是文件指纹

打包后输出的⽂件名的后缀,文件指纹通常用来做文件版本管理,项目发布,有的文件修改了,文件指纹会修改,发布时只发布修改了的文件,没修改的可以不动。

image.png

文件指纹如何生成

Hash:和整个项⽬的构建相关,只要项⽬⽂件有修改,整个项⽬构建的 hash 值就会更改

注释:compile webpack启动那一次,会创建compile对象 complilelation每次代码发生变化,对象会发生变化,compilation发生变化,hash值也会发生变化 Chunkhash:和 webpack 打包的 chunk 有关,不同的 entry 会⽣成不同的 chunkhash 值

注释: chunk 模块,一个chunk对应一个entry,不同chunk对应不同hash,某个页面变化,发布哪个

Contenthash:根据⽂件内容来定义 hash ,⽂件内容不变,则 contenthash 不变(css文件)

JS的文件指纹设置

image.png

CSS的文件指纹设置

image.png

图片的文件指纹设置

image.png

代码压缩

JS、HTML、CSS三个压缩,字节变小,返回变快

image.png

image.png

JS文件压缩

内置了uglifyjs-webpack-plugin,也可以手动加

CSS文件压缩

css-loader在1.0版本后去掉了压缩参数,需要用下图插件及预处理器cssnano

image.png

html文件的压缩

image.png

以上第二章整体代码:gitee.com/geektime-ge…

参考

极客时间 程柳峰老师 《玩转webpack》