Webpack4使用心得

一、使用webpack的原因

原生浏览器,不能很好的识别 ES6 以及更高版本中 ES moudule 模块引入方式。代码中使用 ES moudule ,可以通过webpack进行打包编译成浏览器识别的语法。

webpack同样可以识别,CommonJS模块引入规范、CMD、AMD等等。

webpack,是一个模块打包工具。

二、webpack初使用

1、安装webpack、webpack-cli

2、安装webpack成功后,执行webpack -v 失败。

原因:一般,webpack是安装在当前项目下。但是执行webpack -v 时,node会全局目录找,所以找不到。

方法:既然当前目录下安装了,当前目录下支持npx查看。 npx webpack -v

3、npx webpack 命令相关

(1)、webpack.config.js是默认配置文件。执行npx webpack,默认执行执行npx webapck --config webpack.config.js

(2)、如果使用非默认配置文件命名的文件,则使用npx webpack --config webpackconfig.js

4、node->package.json->scripts下命令讲解

"scripts": {"bundle": "webpack"}

执行npm run bundle时,会在当前项目目录中选择webpack。效果如同npx webpack

5、webpack打包输出注意点

chunk Names为entyr默认的main字段。

entry: {main: './src/index.js'}

Built at: 2019-06-08 15:58:36

    Asset      Size  Chunks            Chunk Names

bundle.js  70.4 KiB      0  [emitted]  main

Entrypoint main = bundle.js

6、import引入js、css、图片等文件时,必须用相对路径或者绝对路径,否则报错。

三、webpack核心概念讲解

1、loader是什么?

webpack 可以使用 loader 来预处理文件。这允许你打包除 JavaScript 之外的任何静态资源。你可以使用 Node.js 来很简单地编写自己的 loader。

2、打包文件

file-loader与url-loader的区别:url-loader可根据文件大小,自动生成文件到dist/main.bundle.js或生成到dist目录中。

3、打包样式

loader加载顺序:从后到前

(1)、css-loader:合并css文件

了解css的模块化打包:避免全局污染,样式只针对当前文件有效。

模块化打包涉及到的参数:

importLoaders:(number)

moudle:(bunble)

(2)、style-loader:将样式挂载到dom上

(3)、sass-loader:

(4)、less-loader:

(5)、postcss-loader:

4、插件 plugins

(1)、autoprefixer:自动添加厂商前缀

(2)、html-webpack-plugins:自动生成打包后js文件的依赖html,并将js注入。

(3)、clean-webpack-plugin:每次打包之前,先默认清空dist目录下的依赖文件。

5、entry与output基础配置

多个entry入口和多个output输出的配置

publicPath:打包后,引入外部cdn资源

6、sourceMap配置

解决源代码和目标生成代码直接的映射关系。

development模式下,sourceMap默认开启

最佳实践推荐:

development下,devtool:cheap-module-eval-source-map

production下,cheap-module-source-map

7、使用webpackDevServer提升开发效率

webpack最基础的打包监听写法:scripts:{"bundle": "webpack --watch"},此功能不够全,使用webpackDevServer

webpackDevServer:webpack-dev-server 为你提供了一个简单的 web server,并且具有 live reloading(实时重新加载) 功能。

webpack-dev-middleware:是一个封装器(wrapper),它可以把 webpack 处理过的文件发送到一个 server。webpack-dev-server 在内部使用了它,然而它也可以作为一个单独的 package 来使用,以便根据需求进行更多自定义设置。

8、HOT Module Replacement 热模块更新(HMR)

模块热替换(hot module replacement 或 HMR)是 webpack 提供的最有用的功能之一。

它允许在运行时更新所有类型的模块,而无需完全刷新。(css:css-loader内置了HMR,自动只更新修改的css,其他不更新,所以不刷新页面。js:js没有相关模块内置,需要手动配置,)注:此功能对css友好,js不友好。因为js需要做许多配置,css不需要。

9、使用Babel处理ES6语法

babel使用的两种方式:

(1)编写.babelrc文件 (.babelrc中presets的执行顺序,也是从下到上)

(2) webpack.config.js中编写

npm install --save-dev babel-loader @babel/core //webpack和babel连接使用

npm install @babel/preset-env --save-dev //基础语法转换

npm install --save @babel/polyfill //高级语法注入

引入框架时,用@babel/plugin-transform-runtime处理

10、webpack实现对react框架代码的打包

npm install --save-dev react

npm install --save-dev react-dom

npm install --save-dev @babel/preset-react

{"presets": ["@babel/preset-react"]}

四、webpack高级概念 讲解

1、tree shaking

它依赖于 ES2015 模块语法的 静态结构 特性,例如 import 和 export

mode: 'development',

optimization: {

usedExports: true

}

{

"name": "your-project",

"sideEffects": false //可使用数组,提示webpack哪些不需要删除。css文件,不需要删除,使用数组"sideEffects": ["*.css"]

}

mode:"development"下,无用代码依然存在,但会清楚表明哪些用了,哪些没用。便于开发嘛。

mode:"producton"下,无用代码会被删除,因为上线了嘛。

2、development 和 production模式的区分打包

development(开发环境) 和 production(生产环境)这两个环境下的构建目标存在着巨大差异。

在开发环境中,我们需要:强大的 source map 和一个有着 live reloading(实时重新加载) 或 hot module replacement(热模块替换) 能力的 localhost server。

而生产环境目标则转移至其他方面,关注点在于压缩 bundle、更轻量的 source map、资源优化等,通过这些优化方式改善加载时间。

由于要遵循逻辑分离,我们通常建议为每个环境编写彼此独立的 webpack 配置。

npm install --save-dev webpack-merge

"scripts": {

    "start": "webpack-dev-server --open --config webpack.dev.js",  //开发环境使用

    "build": "webpack --config webpack.prod.js"  //生成环境打包使用

    },

3、webpack和code splitting(代码分割)

代码分离是 webpack 中最引人注目的特性之一。此特性能够把代码分离到不同的 bundle 中,然后可以按需加载或并行加载这些文件。代码分离可以用于获取更小的bundle,以及控制资源加载优先级,如果使用合理,会极大影响加载时间。

代码分割,和webpack无关

引入文档解释:

常用的代码分离方法有三种:

入口起点:使用 entry 配置手动地分离代码。  //手动配置

防止重复:使用 SplitChunksPlugin 去重和分离 chunk。 //使用webpack方式1

动态导入:通过模块中的内联函数调用来分离代码  //使用webpack方式2

webpack中,实现代码分割的两种方式:

方式1、同步代码:只需要在webpack.config.js中,使用optimization.splitChunks 配置选项的配置即可。此配置方式很智能,会自动识别第三方库,并将第三方库独立打包。

方式2、异步代码(import):异步代码,无需做任何配置,会自动进行代码分割,放置到新的文件中。异步代码实现时,由于 import() 会返回一个 promise,因此它可以和 async 函数一起使用。但是,需要使用像 Babel 这样的预处理器和 Syntax Dynamic Import Babel Plugin。此配置方式也很智能,会自动识别第三方库,并将第三方库独立打包。

所有做的一切,都是为了提高页面速度。

4、splitChunksPlugin 配置参数详解

SplitChunksPlugin 为开箱即用,对用户友好。

5、Lazy Loading 懒加载 和 chunk

懒加载或者按需加载,是一种很好的优化网页或应用的方式。这种方式实际上是先把你的代码在一些逻辑断点处分离开,然后在一些代码块中完成某些操作后,立即引用或即将引用另外一些新的代码块。

懒加载和webpack关系不大,

懒加载,其实就是通过ES Moudle 的import异步加载模块的功能。通过es7中的异步函数 async function(){},也可以实现懒加载。

6、webpack的打包分析工具使用:Preloadin、Prefetching

在声明 import 时,使用下面这些内置指令,可以让 webpack 输出 "resource hint(资源提示)",来告知浏览器:

prefetch(预取):将来某些导航下可能需要的资源

preload(预加载):当前导航下可能需要资源

7、css文件代码分割

它建立在新的Webpackv4功能(模块类型)之上,需要Webpack4才能工作。

这个插件应该只在没有style-loader的生产版本上使用,尤其是在您希望开发HMR的情况下。

MiniCssExtractPlugin,此插件不支持HMR,所以只能用在线上环境。

npm install --save-dev mini-css-extract-plugin

要缩小输出,请使用类似optimize-css-assets-webpack-plugin的Webpack的插件。设置optimization.minimizer将覆盖Webpack提供的默认值,因此请确保还指定一个JS minimizer:

8、webpack与浏览器缓存(caching)

clients(通常是浏览器)将访问该服务器以获取站点及其静态资源,最后一步可能很耗时,这就是为什么浏览器使用一种称为缓存的技术。这允许站点以更少不必要的网络流量更快地加载。

我们可以使用output.filename替换设置来定义输出文件的名称。Webpack提供了一种方法,可以使用名为substitutions的带括号字符串来模板化文件名。[ContentHash]替换将根据资产的内容添加唯一的哈希。当资产的内容更改时,[ContentHash]也将更改。

9、Shimming 的作用

Shimming(垫片)的概念很广泛,用到的也是方方面面。

Webpack编译器可以理解作为ES2015模块、CommonJS或AMD编写的模块。但是,某些第三方库可能需要全局依赖性(例如,jquery的$)。库还可以创建需要导出的全局,在这里Shimming开始发挥作用。

用到的场景:

(1)Jquery中的$

(2)polyfill,浏览器中使用更高级的ES6/7的语法。

这种方式违背了webpack的模块化开发,所以,能不用就不要用。

10、环境变量的使用方法

想要消除 开发环境 和 生产环境 之间的 webpack.config.js 差异,你可能需要环境变量(environment variable)。

五、webpack实战配置案例 讲解

1、Authoring Library

除了应用程序,Webpack还可以用于捆绑JavaScript库。

通过npm创建一个功能的js库,上传发布至npm,供他人使用。

npm publish

npm unpublish --force

"main": "dist/webpack-numbers.js" //package.json文件中用于发布包时的入口路径

2、PWA的打包配置

其实就是通过 Service Workers,当服务器宕机后,client端能够利用缓存继续访问的技术。(前提你的浏览器支持SW)

npm install workbox-webpack-plugin --save-dev

3、TypeScript的打包配置

首先运行以下命令安装TypeScript编译器和loader:

npm install --save-dev typescript ts-loader

4、WebpackDevServer实现请求转发

规范、方便,开发、线上环境接口配置

5、WebpackDevServer解决单页面路由问题

historyApiFallback //解决页面路由跳转失败的问题

此配置只用在本地开发环境,发布线上环境后,需要后端人员配置左下页面路由跳转。

6、EsLint 在Webpack 配置

EsLint和webpack没关系。

可组装的JavaScript和JSX检查工具

使用方式:

(1)使用EsLint规范代码,开发工具最好用Visual Studio Code编辑器。(推荐)

(2)git提交仓库之前,利用git钩子函数检测,不方便。

7、webpack性能优化(尽可能的降低打包速度)

(1)跟上技术迭代(node/npm/yarn)

(2)在尽可能少的模块上应用loader

使用include/exclude

(3)、Plugin尽可能精简并确保可靠

例如:dev环境下,代码压缩就可以不用。

(4)resolve参数合理配置

这些选项更改模块的解析方式。Webpack提供了合理的默认值,但可以详细更改解析。查看模块分辨率,了解分解器如何工作的更多说明。

说白了,也就是导入文件时,能后通过webapck的resolve配置,减少导入模块的路径。

(5)、使用DllPlugin提供提高打包速度

(6)、控制包文件大小

(7)、thread-loader,parallel-webpack,happypack多进程打包

(8)、合理使用sourceMap

(9)、结合stats分析打包结果

(10)、开发环境内存编译

(11)、开发环境无用插件剔除

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

推荐阅读更多精彩内容

  • 前言 本文主要从webpack4.x入手,会对平时常用的Webpack配置一一讲解,各个功能点都有对应的详细例子,...
    BetterChen阅读 1,943评论 0 3
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,273评论 4 31
  • 作者:小 boy (沪江前端开发工程师)本文原创,转载请注明作者及出处。原文地址:https://www.smas...
    iKcamp阅读 2,740评论 0 18
  • 目录第1章 webpack简介 11.1 webpack是什么? 11.2 官网地址 21.3 为什么使用 web...
    lemonzoey阅读 1,731评论 0 1
  • 像我这样的人,什么样的人? 一个死人。 阴阳两分,太极二化,是阴是阳,是死是生。 人们都说人有灵魂,其实未必,但人...
    曙光之路阅读 450评论 2 3