webpack4 实战挖坑简单教程

Webpack

实际项目(持续更新): https://github.com/devin-huang/webpack4.x_Course,喜欢的给星支持

本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时,它会在内部构建一个 依赖图(dependency graph),此依赖图会映射项目所需的每个模块,并生成一个或多个 bundle。

WebPack与Grunt、Gulp相比特性

Webpack和Gulp/Grunt并没有太多的可比性,Gulp/Grunt是一种能够优化前端的开发流程的工具,而WebPack是一种模块化的解决方案,不过Webpack的优点使得Webpack在很多场景下可以替代Gulp/Grunt类的工具。

npm install

npm install
1.安装到项目 node_modules; 
2.不会将依赖写入 devDependencies 或 dependencies;
3.npm install 初始化项目时不会下载

npm install -g
1.不安装到项目 node_modules;
2.不会将依赖写入 devDependencies或dependencies;
3. npm install 初始化项目时不会下载

npm install -save
1.安装到项目 node_modules;
2.将依赖写入 dependencies;
3.npm install 初始化项目时下载; 
4. npm install --production 或注明NODE_ENV变量值为 production 时,自动下载依赖到 node_modules 目录

npm install --save-dev
1.安装依赖到项目 node_modules;
2. 将依赖写入 devDependencies;
3.npm install 初始化项目时下载依赖;
4. npm install --production或注明NODE_ENV变量值为 production 时,不会自动下载依赖到 node_modules 目录


**生产环境,使用npm install --production 安装 dependencies 部分的模块**
**开发环境,npm install ,安装所有 devDependencies 和 dependencies 里面的模块**

初始化项目结构

入门配置参考: https://webpack.docschina.org/guides/

这里配置Webpack 必须要安装三个依赖webpack webpack-cli webpack-dev-server

具体实现可参考源码

项目目录结构

|- build                   webpack模块化打包配置(使用cross-env方式,二选一种方式)
|- build-env               webpack模块化打包配置(使用env方式,二选一种方式)
|- config                  环境变量得配置
|- /src                    目标打包路径
  |- assets                静态资源
  |- style                 样式资源
  |- index.js              主文件入口
  |- index.html            模板文件
|- eslintrc.js             eslint规范配置
|- .gitgnore               Git配置
|- package.json            项目依赖    
|- postcss.config.js       项目兼容浏览器版本配置
  • Entry:入口,Webpack 执行构建的第一步将从 Entry 开始,可抽象成输入。
  • Output:输出结果,在 Webpack 经过一系列处理并得出最终想要的代码后输出结果。
  • Module:模块,在 Webpack 里一切皆模块,一个模块对应着一个文件。Webpack 会从配置的 Entry 开始递归找出所有依赖的模块。
  • Chunk:代码块,一个 Chunk 由多个模块组合而成,用于代码合并与分割。
  • Loader:模块转换器,用于把模块原内容按照需求转换成新内容。
  • Plugin:扩展插件,在 Webpack 构建流程中的特定时机注入扩展逻辑来改变构建结果或做你想要的事情。

devtool 映射

当JS发现错误时准确定位到源文件位置) devtool配置

开发环境:cheap-module-eval-source-map
生产环境:source-map

optimization 优化

优化Webpack

minimizer: CSS/JS压缩

runtimeChunk/splitChunks: JavaScript代码抽离

app                                开发编写的代码
runtime                            将包含chunks 映射关系的 list单独从 app.js里提取出来
vendors                            第三方依赖框架/库

resolve 解析

配置Webpack简写

extensions                          根据配置内容可以省略引用文件的后缀名,依顺序搜索
alias                               指定名称来替代(第三方框架/路径等)

externals 扩展

< CDN引用第三方依赖, 首先声明免除打包指定第三方依赖,再把ProvidePlugin对应依赖库删除,并在index.html中直接引用CDN

plugin

webpack.ProvidePlugin                按需载入第三方框架/库
webpack.DefinePlugin                 根据环境变量定义自定义变量(仅JavaScript调用,非node.js调用)
html-webpack-plugin                  自动将脚本资源在模板文件内引用
mini-css-extract-plugin              将样式抽离成独立文件并在模板文件内引用
webpack-bundle-analyzer              分析项目中占用大空间模块使用CDN引用减轻大小
copy-webpack-plugin                  复制资源
webpack-merge                        合并webpack配置
CleanWebpackPlugin                   清除文件夹/文件
OptimizeCSSAssetsPlugin              压缩 CSS
UglifyJsPlugin                       压缩 JavaScript

优化策略

1.dllPlugin 打包项目时将第三方框架/插件抽离直接再dist/html引用

2.happypack 多线程打包

环境变量

根据环境变量模块化打包

package.json

运行跨平台设置和使用环境变量 npm install --save-dev cross-env

// 使用cross-env切换环境变量
"dev": "cross-env NODE_ENV=development  webpack-dev-server --config build/webpack.dev.js --open --progress",
"build": "cross-env NODE_ENV=production webpack --config build/webpack.prod.js",

// 使用node内置方式切换环境变量
"dev:env": "webpack-dev-server --env development --open --config build-env/webpack.common.js",
"build:env": "webpack --env production --config build-env/webpack.common.js"

根据环境变量配置路径

实际开发中需要对不同环境的API/图片/登录等进行配置,所以需要项目目录结构:config存放不同环境变量的资源路径配置, 再用环境变量模块化打包时指定引用资源路径配置,保存到 webpack.DefinePlugin 从而前端能获取资源路径

config/prod.env.js

module.exports = {
  'API_ROOT': JSON.stringify('http://localhost:8080'),
  'LOGIN_URL': JSON.stringify('http://localhost:8080.prod/login'),
  'IMAGE_URL': JSON.stringify('http://localhost:8080.prod/image')
}

webpack.prod.js

const env = require('../config/prod.env')

plugins: [
  new webpack.DefinePlugin({
    'process.env': env
  })
]

其他

html-loader 与 html-webpack-plugin 结合使用有冲突

vue-cli3 使用https://github.com/neutrinojs/webpack-chain#getting-started

tree shaking 将模块中未引用的代码对象排除引入 (默认生产环境自动压缩已排除)

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

推荐阅读更多精彩内容

  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,283评论 4 31
  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等等一些原本后端的思想开始...
    Charlot阅读 5,435评论 1 32
  • 原文首发于:Webpack 3,从入门到放弃 Update (2017.8.27) : 关于 output.pub...
    昵称都被用完了衰阅读 1,885评论 4 19
  • 【瓜瓜,2018-2-4】 一、《如何阅读一本书》第三章“阅读的第一个层次:基础阅读”读后感: 收获: ...
    kaigua阅读 336评论 0 0
  • 感受 看到王主任也开始读这本书,仿佛感觉有了相伴而行得人。前面得理论收获得只是模糊得印象,本周我一直在干老师...
    守候_96b3阅读 306评论 0 1