webpack-第二节

 一、常见需求

1、简单配置入口和出口,实现build打包功能。

入口配置(建议在配置入口文件时使用绝对路径)

出口配置(在配置出口时只能使用绝对路径)

[chunkhash] 生成hash字符串的方式:每次打包,webpack根据当前chunk进行计算,如果发现有代码变化,就生成新的hash名;如果当前chunk没有代码变化,生成的hash名和上一次一样。

filename: 'js/[name].[chunkhash].js', // 格式化字符串

2、配置本地服务,以便开发环境

webpack-dev-server 它是基于express、sockjs的一个node服务器。全局、本地都安装。

本地服务只对development环境起作用

3、自动清除dist目录,添加文件hash值,开启编译进度条、开启代码压缩

自动清除dist目录

v5:output出口配置中添加 clean:true

如果是v4,用 clean-webpack-plugin

添加文件hash值

filename: 'js/[name].[chunkhash].js', // 格式化字符串

开启编译进度条

plugins中设置 new webpack.ProgressPlugin()

开启代码压缩

optimization:{ minimize:true, minimizer:[new TerserPlugin()] }


4、区分开发环境和生产环境。

const common = require('./common')

const build = require('./build')

const serve = require('./serve')

const { merge } =require('webpack-merge')

module.exports = env => merge(common, env.development?serve:build)

mode区分

5、在当前环境支持图片的模块化

v4的写法

{ test: /\.(png|jpg|jpeg|gif|webp|svg)$/, use: ['url-loader'] },

{ test: /\.(png|jpg|jpeg|gif|webp|svg)$/, use: ['file-loader'] },

v5的写法

{ test: /\.(png|svg|jpg|jpeg|gif)$/, type: 'asset/resource' },

6、在当前环境中支持样式的模块化

css-loader、style-loader、css抽离

处理样式模块(v4和v5的写法是一样的)

{ test: /\.(css|scss|sass)$/, use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'] },

注意1:当同一个项目中使用sass、less、postcss、stylus等多种css预处理器时,我们要分别编写多条样式模块的解析规则。如果只有一种css预处理器,我们通常把处理.css的loader和处理当前这种css预处理器的loader写在一起。

[chunkhash] 生成hash字符串的方式:每次打包,webpack根据当前chunk进行计算,如果发现有代码变化,就生成新的hash名;如果当前chunk没有代码变化,生成的hash名和上一次一样。

注意2:当同一条规则需要多个loader协同完成任务时,要注意loaders的顺序,数组中后面的loader先工作

注意3:一般我们很少使用style-loader,而应该使用。。。。把css代码抽离成样式的文件。

sass-loader用于加载.scss/.sass文件的,要交给sass编译器进行编译。(要特别注意node版本、webpack版本和sass-loader版本之间的兼容性)

node v12+ sass-loader v12+ webpack v5

node v12- sass-loader v10- webpack v4

7、把src中的js代码编译成浏览器能够普通兼容的ES5代码

1、第一条规则:当webpack运行时,如果遇到以.js为后缀的文件时,webpack就使用babel-loader来加载.js文件,然后交给Babel编译器(@babel/core、@babel/preset-env)进行编译转换,最终得到ES5代码。

2、babel-loader 专门用于加载javascript文件,然后交给Babel编译器进行编译。

装了一系列的Babel预设和插件,添加babel.config.js对各种Babel包进行配置

@babel/core Babel编译器核心包

@babel/preset-env 用于编译ES6+代码

@babel/preset-react 用于编译jsx代码

@babel/preset-typesript 用于编译ts代码

3、配置预设

就是一些比较大的javascript语法版本。预设不一定能够编译所有的小语法

presets: [

    ['@babel/preset-env', {}]

  ],

@babel/core 是Babel编译器的核心代码,最新版本 v7

@babel/preset-env 是一个Babel预设,用于编译ES6+语法

@babel/preset-react 是一个Babel预设,用于编译jsx语法

@babel/preset-typescript 是一个Babel预设,用于编译ts语法

4、配置插件

用于弥补预设不能编译的小语法问题

plugins: [

    ["@babel/plugin-proposal-decorators", { "legacy": true }],

    ["@babel/plugin-proposal-class-properties", {}]

  ]

8、在当前环境中集成ESLint检测(集成React开发环境的代码检测)

1、v4 eslint-loader

exclude 忽略对某种目录或文件的检测

enforce:'pre' 这条规则是一条前置规则,发生一般规则之前。只有当这条规则验证通过了,后面的一般规则才会运行。

eslint-loader 专门用于加载javascript文件,然后交给eslint系列的检测工具进行检测。所以,我们还要安装很多合适的eslint检测工具,并在项目中添加eslint的相关配置文件。

2、v4 eslint-webpack-plugin 参见.eslintrc.js这个配置。

3、在v5中,使用eslint-webpack-plugin来配置ESLint,语法是CommonJS语法

意义:协同开发保证代码规范和一致性。(每个公司的ESlint规范不一样)

ESLint只是一个javascript代码检测工具,所以根据不同的项目我们需要安装不同的ESLint检测器(代码规范的标准)

ESLint的配置文件有六种,当前这种是优先级最高的。(.eslint.js文件)

4、如何解决ESLint报错或警告的问题呢?

1、老老实实地找到报错或警告的地方,把它修复好。(开发环境不便于写代码)

2、找到这条ESLint规则的名称,在ESLint配置文件中修改它的检测级别

3、使用ESlint注释包裹代码,忽略这段代码的检测。

// eslint-disable-line

/* eslint-disable */ /* eslint-enable */

/* eslint-disable no-var */ /* eslint-enable no-var */

4、找到webpack配置文件,把eslint规则注释掉。(慎用)

5、在项目的根目录添加 .eslintigore 这个文件。(选择性地忽略某些目录或文件)

经验:如果项目老是频繁报eslint错误,建议直接在项目根目录添加一个.eslintigore文件,选择性忽略某些代码的检测。当提交代码前,一定要移除.eslintigore文件,重启项目,修复所有的eslint问题。(协同开发时,切忌把有eslint问题的代码提交到远程)

5、定制React开发环境的代码检测:

eslint-loader 在webpack v4中集成ESLint

eslint-webpack-plugin 在webpack v5中集成ESlint

eslint 这是ESLint官方提供的基础检测工具,只要使用ESLint必须安装它

eslint-plugin-react 这是一个用于检测React语法的ESlint插件

eslint-plugin-react-hooks 这是一个用于检测React Hooks语法的ESLint插件

eslint-plugin-jsx-a11y 这是一个用于检测React JSX元素属性语法的ESLint插件

eslint-plugin-import 这是一个用于检测ES6+模块化语法的ESLint插件

eslint-config-airbnb 由爱彼迎公司开源的一个ESLint套件

@babel/eslint-parser 它是Babel-ESlint的前身,可兼容ESLint的默认解析器,用于对比较新的js语法进行检测。

6、改变eslint规则的检测级别(三种检测级别)

off (0) -关闭规则

warn (1) -违反规则给警告

error (2) -违反规则给报错

9、在当前环境下支持jsx语法

安装 @babel/preset-react 参见babel.config.js这个配置。

二、webpack拓展

loader

1、常用loader有哪些?罗列七八个。

style-loader 将css添加到DOM的内联样式标签style里

css-loader 允许将css文件通过require的方式引入,并返回css代码

less-loader 处理less

sass-loader 处理sass

file-loader 分发文件到output目录并返回相对路径

url-loader 和file-loader类似,但是当文件小于设定的limit时可以返回一个Data Url

html-minify-loader 压缩HTML

babel-loader 用babel来转换ES6文件到ES5

2、自定义loader

每个loader都是一个function函数,它接收一种文件(对象或字符串),最终返回另外一种文件(对象、字符串或JS代码),什么是必须返回JS代码呢?如果当前封装的loader用于webpack规则中最后的一个loader,那么必须返回js代码。

自定义loader的基本语法:

module.exports = function(source) {

// 使用任何第三方js模块do something

const result = 'some string or object'

// return `module.exports = ${JSON.stringify(result)}`

return `export default ${JSON.stringify(result)}` }

如果一个loader不用于webpack规则的最后一个loader,不要抛出js代码。

plugin

1、常用plugins有哪些?罗列七八个。

Html-Webpack-Plugin 在打包结束后,动生成个 html 文件,并把打包生成的js 模块引到该 html 中

clean-webpack-plugin 删除(清理)构建目录  

MiniCssExtractPlugin  抽离css文件

ESLintPlugin  代码检测工具

2、自定义plugin

每个plugin本质上都是一个class类(这个类必须有一个叫apply实例方法,在这个apply用于向webpack的hooks钩子上添加一个事件)。

自定义封装plugin最重要的是理解什么webpack的hooks钩子。

举例:clean-webpack-plugin

优化

Wepack开发环境优化(start)优化标准:运行速度尽量快

1、devtool: 'inline-source-map'(负)

2、watch代码依赖图的变化,在v5中hot:true实现热更新(正)

3、在开发环境中开启memory缓存(生产环境下默认是关闭的)(正)

4、在编写各种loaders规则或者plugin时,使用exclude、include减少node文件系统的工作。(正)

5、巧用resolve对各种路径进行优化,缩小搜索范围。(正)

6、使用thread-loader(注意硬件配置)开启多线程构建。(正)

7、使用cache-loader对“指定文件模块”进行缓存。(正)

8、使用 speed-measure-webpack-plugin 对所有的plugins进行加速。(正)

Webpack生产打包优化(build)优化标准:代码质量优化

1、devtool: 'source-map'(正)

2、chunks拆分:

① 在前端代码中使用“动态导入()=>import()”自动实现代码分离(正)(推荐)安装 @babel/plugin-syntax-dynamic-import 支持动态导入语法

② 使用optimization.splitChunks 或 split-chunks-plugin手动实现分离分离(正)(很少用)

3、vendor抽离:在entry入口中对多个chunk中重复的代码进行抽离(正)

4、bundle分析技术:使用webpack-bundle-analyzer对“代码依赖图”进行人工分析

5、使用 tree-shaking 技术把src中的“死代码”移除掉,以节省打包后代码的体积。具体做法是在package.json中添加"sideEffects":false,该功能只对mode:production起作用。

6、抽离CSS并压缩:

① 使用 mini-css-extract-plugin 把css代码抽离出来

② 使用 css-minimizer-webpack-plugin 把css代码进行压缩

7、terser压缩:使用 terser-webpack-plugin 集成terser高性能压缩

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

推荐阅读更多精彩内容