webpack 打包全流程

目录

1 webpack的安装

2 webpack的配置

配置流程:

1 webpack安装

2 创建webpack配置文件 webpack.config.js

3 配置入口 entry

单入口和多入口

2. 动态配置入口文件

4 配置出口 output

5 配置模式 mode(webpack4)

6 配置解析策略 resolve

7 配置解析和转换文件的策略 module : loader

1. noParse

2. rules

8 、配置优化 optimization(webpack4)

1. 最小化包

2. 拆包

拆分业务代码

拆分第三方库

动态加载

9、配置 plugin  插件 

Eslint

  Babel  

10 watch 与 watchOptions

watch

参考: 

1 模块化

2前端模块化(AMD、CMD、commonJs、ES6)  


前端代码为何要进行构建和打包?

module chunk bundle 分别什么意思,有何区别?

loader 和 plugin 的区别?

webpack 如何实现懒加载?

webpack 常见性能优化?

bable-runtime 和 babel-polyfill 的区别?

1 webpack的安装

(wepack为了正常运行必须依赖node环境,而node环境为了可以正常的执行,必须使用npm工具管理node中各种依赖的包)

  • 安装webpack首先要安装Node.js,Node.js自带了软件包管理工具npm
  • 全局安装webpack(npm install webpack@3.6.0 -g)
  • 局部安装webpck(npm install webpack@3.6.0 --save-dev)–save-dev是开发时依赖,项目打包后不需要继续使用。

2 webpack的配置

webpack配置_shkmzzh的博客-CSDN博客

webpack配置完全指南_webpack 配置_gogo2027的博客-CSDN博客

webpack 之后会发现很简单,基础的配置可以分为以下几个方面: entry 、 output 、 mode 、 resolve 、 module 、 optimization 、 plugin 、 source map 、 performance 等,

  • webpack 是前端的打包工具

  • 打包的工作内容是什么

  1. 扫描项目,生成整个项目所有模块的依赖关系,根据配置对模块进行合并,生成一个单独的文件。修改html文件,让html文件引用生成后的文件
  2. 将浏览器无法直接识别的(less、sass、ts)文件,转换成浏览器可以实现的内容。
  3. 将浏览器暂时无法支持的JS新的语法转换成浏览器可以支持的语法

配置流程:

1 webpack安装

webpack是基于node.js的,使用前需要安装node

-D 是 --save-dev 的缩写,表示开发时依赖,只在项目开发阶段用到。 -S 是 --save 的缩写,表示运行时依赖,即项目打包发布运行时要用到。

npm初始化

npm init -y

安装webpack

webpack内部还依赖webpack-cli,所以webpack-cli也要安装

npm install --save-dev webpack webpack-cli

2 创建webpack配置文件 webpack.config.js

// 导入path模块
const path = require('path')
​
// webpack配置
module.exports = {// 配置打包入口文件entry: path.resolve(__dirname, 'src', 'index.js'),// 配置打包输出位置,及文件名output: {path: path.resolve(__dirname, 'dist'),// 输出文件名filename: 'bundle.js'}
}

3 配置入口 entry

单入口和多入口

module.exports = { entry: `./index.js`, }

2. 动态配置入口文件

当构建项目包含多个子项目时,每次增加一个子系统都需要将入口文件写入 webpack 配置文件中,其实我们让webpack 动态获取入口文件,例如:

// 使用 glob 等工具使用若干通配符,运行时获得 entry 的条目
module.exports = {entry: glob.sync('./project/**/index.js').reduce((acc, path) => {const entry = path.replace('/index.js', '')acc[entry] = pathreturn acc}, {}),
}

4 配置出口 output

用于告知 webpack 如何构建编译后的文件,可以自定义输出文件的位置和名称:

module.exports = {output: { // path 必须为绝对路径// 输出文件路径path: path.resolve(__dirname, '../../dist/build'),// 包名称filename: "[name].bundle.js",// 或使用函数返回名(不常用)// filename: (chunkData) => {//   return chunkData.chunk.name === 'main' ? '[name].js': '[name]/[name].js';// },// 块名,公共块名(非入口)chunkFilename: '[name].[chunkhash].bundle.js',// 打包生成的 index.html 文件里面引用资源的前缀// 也为发布到线上资源的 URL 前缀// 使用的是相对路径,默认为 ''publicPath: '/', }
}

在 webpack4 开发模式下,会默认启动 output.pathinfo ,它会输出一些额外的注释信息,对项目调试非常有用,尤其是使用 eval devtool 时。

filename :[name] 为 entry 配置的 key,除此之外,还可以是 [id] (内部块 id )、 [hash]、[contenthash] 等。
 

5 配置模式 mode(webpack4)

设置 mode ,可以让 webpack 自动调起相应的内置优化

module.exports = {// 可以是 none、development、production// 默认为 productionmode: 'production'
}

production 模式下给你更好的用户体验:

  • 较小的输出包体积
  • 浏览器中更快的代码执行速度
  • 忽略开发中的代码
  • 不公开源代码或文件路径
  • 易于使用的输出资产

development 模式会给予你最好的开发体验:

  • 浏览器调试工具
  • 快速增量编译可加快开发周期
  • 运行时提供有用的错误消息

6 配置解析策略 resolve

自定义寻找依赖模块时的策略(例如 import _ from 'lodash'):

module.exports = {resolve: {// 设置模块导入规则,import/require时会直接在这些目录找文件// 可以指明存放第三方模块的绝对路径,以减少寻找,// 默认 node_modulesmodules: [path.resolve(`${project}/components`), 'node_modules'],// import导入时省略后缀// 注意:尽可能的减少后缀尝试的可能性extensions: ['.js', '.jsx', '.react.js', '.css', '.json'],// import导入时别名,减少耗时的递归解析操作alias: {'@components': path.resolve(`${project}/components`),'@style': path.resolve('asset/style'),},// 很多第三方库会针对不同的环境提供几份代码// webpack 会根据 mainFields 的配置去决定优先采用那份代码// 它会根据 webpack 配置中指定的 target 不同,默认值也会有所不同mainFields: ['browser', 'module', 'main'],},
}

7 配置解析和转换文件的策略 module : loader

决定如何处理项目中不同类型的模块,通常是配置 module.rules 里的 Loader:

// webpack配置
module.exports = {// ...// 扩展文件加载模块 - css模块加module: {// 由于可以加载多种文件,每种文件对应一种loader,所以是数组rules: [// 由于是多种文件,所以使用扩展名进行区分,再应用不同的loader{// 正则判断文件类型test: /\.css$/i,// 这种类型文件使用以下loaderuse: ['style-loader', 'css-loader'],},{// 判断less文件test: /\.less$/i,use: ["style-loader","css-loader","less-loader"]},{// 加载图片资料模板test: /\.(png|jpg|jpeg|gif|svg)$/,type: 'asset/resource'},{// 加载字体文件test: /\.(eot|ttf|otf|woff2)$/,type: 'asset'}]}
}

1. noParse

指明 webpack 不去解析某些内容,该方式有助于提升 webpack 的构建性能。

2. rules

常见的 loader 有:

  • babel-loader:解析 .js 和 .jsx 文件

  • tsx-loader:处理 ts 文件

  • less-loader:处理 less 文件,并将其编译为 css

  • sass-loader:处理 sass、scss 文件,并将其编译为 css

  • postcss-loader

  • css-loader:处理 css 文件

    style-loader:将 css 注入到 DOM

    file-loader:将文件上的import / require 解析为 url,并将该文件输出到输出目录中

    url-loader:用于将文件转换成 base64 uri 的 webpack 加载程序

    html-loader:将 HTML 导出为字符串, 当编译器要求时,将 HTML 最小化

8 、配置优化 optimization(webpack4)

webapck4 会根据你所选择的 mode 进行优化,你可以手动配置,它将会覆盖自动优化

主要涉及两方面的优化:

  • 最小化包
  • 拆包

  

1. 最小化包

2. 拆包

拆分 node_modules

很多情况下,我们不需要手动拆分包,可以使用 optimization.splitChunks :

拆分业务代码
拆分第三方库
动态加载

9、配置 plugin  插件 

配置 Plugin 去处理及优化其它的需求,

Eslint

npm i eslint-webpack-plugin eslint -D

配置文件由很多种写法:

  • .eslintrc.*:新建文件,位于项目根目录
    • .eslintrc
    • .eslintrc.js
    • .eslintrc.json
    • 区别在于配置格式不一样
  • package.json 中 eslintConfig:不需要创建文件,在原有文件基础上写
  • rules 具体规则
  • "off" 或 0 - 关闭规则
  • "warn" 或 1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出)
  • "error" 或 2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)

  Babel  

npm i babel-loader @babel/core @babel/preset-env -D

配置文件由很多种写法:

babel.config.*:新建文件,位于项目根目录
babel.config.js
babel.config.json

package.json 中 babel:不需要创建文件,在原有文件基础上写
Babel 会查找和自动读取它们,所以以上配置文件只需要存在一个即可
 

module.exports = {plugins: [// 优化 requirenew webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en|zh/),// 用于提升构建速度createHappyPlugin('happy-babel', [{loader: 'babel-loader',options: {presets: ['@babel/preset-env', "@babel/preset-react"],plugins: [['@babel/plugin-proposal-class-properties', {loose: true}]],// babel-loader 支持缓存转换出的结果,通过 cacheDirectory 选项开启cacheDirectory: true,// Save disk space when time isn't as importantcacheCompression: true,compact: true,}}])]
}

常用 plugins:

html-webpack-plugin:生成 html 文件,并将包添加到 html 中
webpack-parallel-uglify-plugin:压缩 js(多进程并行处理压缩)
happypack:多线程loader,用于提升构建速度
hard-source-webpack-plugin:为模块提供中间缓存步骤,显著提高打包速度
webpack-merge:合并 webpack 配置
mini-css-extract-plugin:抽离 css
optimize-css-assets-webpack-plugin:压缩 css
add-asset-html-webpack-plugin:将 JavaScript 或 CSS 资产添加到 html-webpack-plugin 生成的 HTML 中
更多插件可见:plugins
 

10 watch 与 watchOptions

我们可以在命令行里启动监听( --watch ):

webpack --watch --config webpack.config.dev.js
 

在 webpack-dev-server 和 webpack-dev-middleware 中,默认启用了监视模式。

watch

监视文件更新,并在文件更新时重新编译:

module.export = {// 启用监听模式watch: true,
}

webpack看这一篇就够了_itpeilibo的博客-CSDN博客

参考: 

1 模块化

前端模块化开发_Ukashi的博客-CSDN博客

简单来说,将一个项目划分为不同的功能模块来开发维护的过程就是模块化。

js一开始并没有模块化的概念,直到ajax被提出,前端能够像后端请求数据,前端逻辑越来越复杂,就出现了许多问题:全局变量,函数名冲突,依赖关系不好处理。模块化就是衍生出来解决这些问题的一种方法

模块化开发优点:

  • 解决命名冲突
  • 提供复用性
  • 提高代码可维护性
  • 灵活架构,焦点分离,方便模块间组合、分解
  • 多人协作互不干扰


2前端模块化(AMD、CMD、commonJs、ES6)  

前端模块化(AMD、CMD、commonJs、ES6)_前端amd_GA莹莹子的博客-CSDN博客

CommonJs和ES6模块化的区别?
1.CommonJs模块引入方式使用require(),导出的方式是module.exports=value或exports.xx=value。
ES6使用import {} from(必须放在文件开头)和export let/const或export {}引入和导出。
2.CommonJs模块输出的是一个值的拷贝。
ES6输出的是值的引用。

3.CommonJs模块是运行时加载,加载的是一个对象(exports或module.exports)。
ES6模块是编译(将import语法转化为require)时加载的,效率更高,不是对象,它的对外接口是一种静态定义,只有在脚本使用时才会调用。
ES6渐渐取代CommonJs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/46291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot基于Zookeeper实现分布式锁

文章目录 问题背景前言实现搭建Zookeeper容器引入依赖ZK客户端的配置类ZK客户端的工厂类注入bean构建测试类 问题背景 研究分布式锁,基于ZK实现,需要整合到SpringBoot使用 前言 参考自SpringBoot集成Curator实现Zookeeper基本操作,Zookeeper入…

题解:ABC278C - FF

题解:ABC278C - FF 题目 链接:Atcoder。 链接:洛谷。 难度 算法难度:C。 思维难度:C。 调码难度:B。 综合评价:普及-。 算法 模拟STL 思路 用map存储每两个用户a、b是否满足a关注了…

亚马逊加拿大站釉面陶瓷器皿和玻璃器皿SOR/2011-17认证办理流程

亚马逊加拿大站釉面陶瓷器皿和玻璃器皿SOR/2011-17认证办理流程  1. 首先,您需要填写申请表格并准备所需的文件和材料。 2. 确保您符合SOR/2011-17认证的要求,并提供您的公司信息以便进行验证。 3. 将申请表格和材料提交给认证机构,并支付相…

ssm+vue校园美食交流系统源码

ssmvue校园美食交流系统源码和论文026 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多商…

el-table 实现动态表头 静态内容 根据数据显示动态输入框

直接放代码了 <el-table:data"form.tableDataA"borderstripestyle"width: 100%; margin-top: 20px"><el-table-columnv-for"(category, categoryIndex) in form.tableDataA":key"categoryIndex":label"category.name&qu…

Java虚拟机(JVM):垃圾收集算法

目录 一、分代收集理论 二、标记-清除算法 三、标记-复制算法 四、标记-整理算法 一、分代收集理论 分代收集理论建立在两个分代假说之上&#xff1a; 1、弱分代假说&#xff1a;绝大多数对象都是朝生夕灭的。 2、强分代假说&#xff1a;熬过越多次垃圾收集过程的对象就…

5.8.webrtc事件处理基础知识

在之前的课程中呢&#xff0c;我向你介绍了大量web rtc线程相关内容&#xff0c;今天呢&#xff0c;我们来看一下线程事件处理的基本知识。首先&#xff0c;我们要清楚啊&#xff0c;不同的平台处理事件的API是不一样的&#xff0c;这就如同我们当时创建线程是类似的&#xff0…

K8s实战4-使用Helm在Azure上部署Ingress-Nginx和Tokengateway

手动发布Ingress-Nginx 1 登录到aks(dfinder-gw-aks) az login az account set --subscription ${sub ID} az aks get-credentials --resource-group ${groupname} --name ${aks name} 2 下载 ingress-nginx-4.2.5.tgz curl -LO https://github.com/kubernetes/ingress-ngi…

“开发和运维”只是一个开始,最终目标是构建高质量的软件工程

随着技术的飞速发展&#xff0c;软件行业不断寻求改进和创新的方法来提供更高质量的产品。在这方面&#xff0c;DevOps已经展现出了巨大的潜力。通过打破开发和运维之间的壁垒&#xff0c;DevOps将持续集成、持续交付和自动化流程引入到软件开发中&#xff0c;使团队能够更快地…

数字孪生助力智慧水务:科技创新赋能水资源保护

智慧水务中&#xff0c;数字孪生有着深远的作用&#xff0c;正引领着水资源管理和环境保护的创新变革。随着城市化和工业化的不断推进&#xff0c;水资源的可持续利用和管理愈发显得重要&#xff0c;而数字孪生技术为解决这一挑战提供了独特的解决方案。 数字孪生技术&#xf…

十七、DoIP诊断通信 2 (专栏:从零开始搭建一个UDS诊断自动化测试CANoe工程)

专栏:从零开始搭建一个UDS诊断自动化测试CANoe工程 文章目录 专栏:从零开始搭建一个UDS诊断自动化测试CANoe工程前言一、以太网panel面板配置二、DoIP建立连接与断开连接三、panel面板上的DoIP诊断报文发送接收SEND按钮会话切换复位1101按钮解锁按钮DTC按钮3E80保持会话前言 …

Docker容器无法启动 Cannot find /usr/local/tomcat/bin/setclasspath.sh

报错信息如下 解决办法 权限不够 加上--privileged 获取最大权限 docker run --privileged --name lenglianerqi -p 9266:8080 -v /opt/docker/lenglianerqi/webapps:/usr/local/tomcat/webapps/ -v /opt/docker/lenglianerqi/webapps/userfile:/usr/local/tomcat/webapps/u…

Code Lab - 1

1.基本操作 1.1 读取数据集&#xff08;以KarateClub为例&#xff09; import networkx as nxG nx.karate_club_graph() print(type(G))# 可视化图 nx.draw(G, with_labelsTrue) 1.2 节点的平均度数 def average_degree(num_edges, num_nodes):avg_degree 0# 节点的平均度…

Android Studio:Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7

原项目使用jdk8&#xff0c;升级gradle后出现的该问题。 java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7at org.codehaus.groovy.vmplugin.VMPluginFactory.<clinit>(VMPluginFactory.java:43)at org.codehaus.gro…

Qt安卓开发经验技巧总结V202308

01&#xff1a;01-05 pro中引入安卓拓展模块 QT androidextras 。pro中指定安卓打包目录 ANDROID_PACKAGE_SOURCE_DIR $$PWD/android 指定引入安卓特定目录比如程序图标、变量、颜色、java代码文件、jar库文件等。 AndroidManifest.xml 每个程序唯一的一个全局配置文件&…

【Redis】Redis中的布隆过滤器

【Redis】Redis中的布隆过滤器 前言 在实际开发中&#xff0c;会遇到很多要判断一个元素是否在某个集合中的业务场景&#xff0c;类似于垃圾邮件的识别&#xff0c;恶意IP地址的访问&#xff0c;缓存穿透等情况。类似于缓存穿透这种情况&#xff0c;有许多的解决方法&#xf…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 2 Inport和Outports 标签页介绍

上篇我们介绍了Function页的内容,这篇我们介绍Inports和Outports页的内容,这里我们再次强调一个概念,code mapping是以simulink的角度去看的,就是先要在模型中建立simulink模块,在code mapping里映射他要对应的autosar的元素,之后生成代码时的c语言的名字是以Autosar的元…

永久设置pip指定国内镜像源(windows内)

1.首先列出国内四个镜像源网站&#xff1a; 一、清华源 https://pypi.tuna.tsinghua.edu.cn/simple/ 二、阿里源 https://mirrors.aliyun.com/pypi/simple 三、中科大源 https://pypi.mirrors.ustc.edu.cn/simple/ 四、豆瓣源 http://pypi.douban.com/simple/ 2.一般下载所需要…

08无监督学习——聚类

1.什么是聚类任务&#xff1f; 类别&#xff1a;无监督学习 目的&#xff1a;通过对无标记训练样本的学习来揭示数据的内在性质及规律&#xff0c;为进一步的数据分析提供基础。 1.1K均值聚类 步骤&#xff1a; 随机选取样本作为初始均值向量(初始值:k的值【即几个簇】)分别…

colab释放GPU显存

不用其他博客说的安装包&#xff0c;然后查看进程&#xff0c;kill&#xff0c;本文介绍一种简单的方法。 点击运行过代码的ipynb页面右上角的下三角&#xff0c;然后点击展开菜单栏中的View resources 随后会展开一个侧边栏&#xff0c;点击 manage sessions 3. 在页面中央会…