初识webpack(一)概念、入口配置、输出配置、loader等

目录

(一)概念

webpack的依赖图

(二)webpack的基本使用

(三)webpack的配置文件

1.入口(entry)配置

2.输出(output)配置

(三)loader

1.css文件处理 

(1)安装css-loader和style-loader

(2)在webpack.config.js中配置loader 

2.less文件处理

3.postcss的使用

(1)安装postcss和postcss-loader

(2)安装postcss-preset-env插件

4.图片文件处理

示范代码准备:

(1)asset/resource模块类型

(2)asset/inline模块类型

(3)asset模块类型

5.JS文件的babel处理

6.vue文件处理

准备入口文件main.js和vue文件

在webpack.config.js中配置loader


(一)概念

webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。

当 webpack 处理应用程序时,它会在内部从一个或多个入口点构建一个 依赖图(dependency graph),然后将你项目中所需的每一个模块组合成一个或多个 bundles,它们均为静态资源,用于展示你的内容。

webpack的依赖图

  1. 根据指令或配置找到入口文件
  2. 从入口文件出发构建依赖关系图,这个关系图会包括项目中所需的所有模块(js、css、字体、图片等) 
  3. 遍历图结构,依次打包每个模块(依靠loader完成)

webpack只能理解 JavaScript 和 JSON 文件,而对于其他类型文件:css、TypeScript等,需要依靠安装对应的 loader 对其进行转换(后续会补充)。

(二)webpack的基本使用

1.初始化项目,生成package.json文件

npm init -y 

2.安装webpack和webpack-cli包

npm i webpack webpack-cli -D 

3.在package.json配置打包指令

"scripts": {

    "build": "webpack"

  },

4.在终端输入 npm run build 即可打包项目

(三)webpack的配置文件

webpack可以开箱即用,无需设置配置文件,但会将 src/index,js 文件作为入口文件,将 dist/main.js 作为输出文件。如果没有对应路径的入口文件,就会打包失败并报错。

如果需要对webpack进行更完善的配置,就需要创建webpack.config.js文件,webpack会自动使用它的配置内容

1.入口(entry)配置

可以配置一个或多个入口文件 

module.exports = {entry: './src/index.js'
}

2.输出(output)配置

通过配置 output 选项,告知 webpack 如何向硬盘写入编译文件。注意,即使可以存在多个 entry 起点,但只能指定一个 output 配置。

通过如下配置打包后代码会生成在/dist/bundle.js中 

const path = require('path')module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, './dist')}
}

(三)loader

loader 让 webpack 能够去处理其他类型的文件,并将它们转换为有效 模块,以供应用程序使用,以及被添加到依赖图中。

两种使用loader的方法:

  1. 配置法:在webpack配置文件中使用(推荐)
  2. 内嵌法:在需要解析的文件中引入对应loader(每个文件都需要单独引入,较繁琐)

loader有两个属性:

  1. test属性:用于识别文件类型
  2. use属性:用于进行转换时使用哪个loader 

1.css文件处理 

直接将css文件引入到入口文件进行打包会导致报错

import './components/css_test.css'

因此,需要依靠css-loader解析css文件,依靠style-loader将解析好的css插入DOM中 

参考文档:

css-loader | webpack 中文文档 | webpack中文文档 | webpack中文网

style-loader | webpack 中文文档 | webpack中文文档 | webpack中文网

(1)安装css-loader和style-loader

npm i css-loader style-loader -D 

(2)在webpack.config.js中配置loader 

注意:loader 从前往后地取值(evaluate)/执行(execute) ,即先执行css-loader再执行style-loader

module: {rules: [{/* 正则表达式 */test: /\.css$/, // 识别.css后缀的文件/* 使用对应loader解析,解析方向:从后往前 */// 简写形式use: ['style-loader', 'css-loader']// 完整形式// use: [//     { loader: 'style-loader' },//     { loader: 'css-loader' },// ]}]}

重新打包后,css就解析成功了,但是是通过页内样式添加进来的。后续css文件的单独抽取以及压缩等操作会在后面学习到。

2.less文件处理

参考文档:less-loader | webpack 中文文档 | webpack中文文档 | webpack中文网

(1)安装less和less-loader组件

npm i less less-loader -D 

(2)配置webpack.config.js

{test: /\.less$/,use: ['style-loader', 'css-loader', 'less-loader']
}

3.postcss的使用

postcss是一个用 JavaScript 工具和插件转换 CSS 代码的工具,可以帮助我们进行一些CSS的转换和适配,比如自动添加浏览器前缀、css样式的重置

PostCSS - 是一个用 JavaScript 工具和插件来转换 CSS 代码的工具 | PostCSS中文网

postcss的 postcss-preset-env 插件可以帮助我们将一些现代的 CSS 特性,转成大多数浏览器认识的 CSS,并且会根据目标浏览器或者运行时环境添加所需的 polyfill,已经内置了autoprefixer 

(1)安装postcss和postcss-loader

npm i postcss postcss-loader -D

(2)安装postcss-preset-env插件

npm i poscss-preset-env -D

(3)配置webpack.config.js

 {test: /\.css$/, // 识别.css后缀的文件use: [{ loader: 'style-loader' },{ loader: 'css-loader' },{loader: 'postcss-loader',options: {/* 对postcss进行配置 */postcssOptions: {/* 配置插件 */plugins: [['postcss-preset-env',],],},},}]
},

可以将postcss的具体配置写到postcss.config.js文件中,配置更简洁

在postcss.config.js文件中:
module.exports = {plugins: ['postcss-preset-env']
}在webpack.config.js中:{test: /\.css$/, // 识别.css后缀的文件use: [ 'style-loader','css-loader','postcss-loader']
},

再重新打包后,postcss就会根据样式自动添加浏览器前缀

4.图片文件处理

资源模块 | webpack 中文文档 | webpack中文文档 | webpack中文网

在webpack5之前,处理资源文件还需要用到相关的loader

在webpack5中,资源模块(asset module)是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外 loader 

资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loader:

  • asset/resource:发送一个单独的文件并导出 URL。之前通过使用 file-loader 实现。
  • asset/inline:导出一个资源的 data URI。之前通过使用 url-loader 实现。
  • asset/source:导出资源的源代码。之前通过使用 raw-loader 实现。(不常用)
  • asset:在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用 url-loader,并且配置资源体积限制实现。(推荐)

示范代码准备:

用到两个文件大小不同的图片(后续解释原因),一个使用background-url链接到图片,一个使用img标签src链接到图片。

.image {background-image: url(../images/p1.jpg);
}
import img2 from '../images/p2.jpg'
import '../style/img.css'// 图片1 采用url()展示
const image1 = document.createElement('img')
image1.classList.add('image')
document.body.append(image1)// 图片2 采用直接链接展示
const image2 = document.createElement('img')
image2.src = img2
document.body.append(image2)

接下来会分别展示asset/resource、asset/inline、asset这三种资源模块类型的区别 

(1)asset/resource模块类型

在webpack配置文件中配置模块类型

{test: /\.(png|jpe?g|gif|svg)$/, // 识别图片后缀的文件type: 'asset/resource'
}

打包后,可以看到用到的图片资源都被复制到打包文件夹中,以哈希值进行重命名了

所有图片文件都将被发送到输出目录,并且其路径将被注入到 bundle 中,除此之外,你可以为它们自定义 outputPath 和 publicPath 属性。 

自定义输出文件名

第一种方法:在配置文件的output里设置assetModuleFilename。

可以设置固定名称(不建议),也可以设置相关占位符,如 

assetModuleFilename: 'images/[hash][ext][query]'

但是不建议在这里配置,资源文件除了图片还有可能是字体文件等资源,这样会导致混淆

第二种方法:在rules里进行配置generator

{test: /\.(png|jpe?g|gif|svg)$/, // 识别图片后缀的文件type: 'asset/resource',/* 第二种:在这里设置输出资源路径和文件名 */generator: {/* 占位符:name:文件原本的名字;hash:webpack生成的哈希值;ext:扩展名*/filename: 'image/[name]_[hash][ext]'}
}

打包后图片资源文件都存储在image文件夹中,并以name和hash命名

(2)asset/inline模块类型

配置文件:

{test: /\.(png|jpe?g|gif|svg)$/, // 识别图片后缀的文件type: 'asset/inline', // 将图片转换为base64编码的data:uri数据存放在js文件中
}

打包后,图片资源不再以文件形式打包,而是转换为base64编码的数据存储到js文件中,这会导致js文件变大

(3)asset模块类型

以上两种模块类型都太过绝对,不是最优解

  • 使用resource模块类型,图片过多会影响网络请求;
  • 使用inline模块类型,图片过大会增加js文件体积,导致页面渲染缓慢 ;

使用asset类型进行自动选择 

webpack 将按照默认条件,自动地在 resource 和 inline 之间进行选择:小于 8kb 的文件,将会视为 inline 模块类型,否则会被视为 resource 模块类型。 

可以根据自己的情况,在 webpack 配置的 module rule 层级中自定义使用inline类型的最大文件大小

 {test: /\.(png|jpe?g|gif|svg)$/, // 识别图片后缀的文件type: 'asset',/* 第二种:在这里设置输出资源路径和文件名 */generator: {/* 占位符:name:文件原本的名字;hash:webpack生成的哈希值;ext:扩展名*/filename: 'image/[name]_[hash][ext]'},/* 自定义使用inline还是resource类型 */parser: {dataUrlCondition: {maxSize: 200 * 1024 // 200kb 单位为byte}}
},

5.JS文件的babel处理

webpack对代码进行打包时,会将ES6+的代码原封不动的打包进文件,而一些低版本浏览器无法兼容,因此使用babel工具对代码进行转换,将ES6+转换为ES5代码 

Babel 是一个工具链,主要用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。 

Babel 是什么? · Babel 中文文档 | Babel中文网

@babel/core:是babel的核心库,所有的核心Api都在这个库里,这些Api供babel-loader调用

预设(presets) :

Babel 的预设(preset)可以被看作是一组 Babel 插件和/或 options 配置的可共享模块

@babel/preset-env:用于将es6+转换为es5语法

@babel/preset-typescript:用于typescript语法转换

@babel/preset-react:用于react代码

高版本js代码转es5规范的配置如下:

下载对应组件和loader

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

配置webpack.config.js文件

rules: [/* babel预设插件的使用 */{test: /\.js$/,use: {loader: 'babel-loader',options: {// 使用预设,将高版本js语法转换为es5语法presets: ['@babel/preset-env'] 
}}}]

6.vue文件处理

通过vue-loader来编写单文件组件格式的vue文件

介绍 | Vue Loader

安装vue-loadervue-template-compiler 

npm install -D vue-loader vue-template-compiler

vue-template-compiler插件:用于编译template标签包裹的内容 

准备入口文件main.js和vue文件

/* main.js */
import { createApp } from 'vue'
import App from './app.vue'createApp(App).mount('#app')/* app.vue*/
<template><div><h1 class="title">{{ msg }}</h1></div>
</template><script>
export default {name: 'App',data() {return {msg: "7777777"}},
}
</script><style>
.title {color: red;
}
</style>

在webpack.config.js中配置loader

const { VueLoaderPlugin } = require('vue-loader')module: {rules: [/* vue文件的处理 */{test: /\.vue$/,use: ['vue-loader']},{test: /\.css$/, // 识别.css后缀的文件use: ['vue-style-loader', 'css-loader',]},],},
plugins: [new VueLoaderPlugin()]

VueLoaderPlugin插件作用:

将定义过的其它规则复制并应用到 .vue 文件里相应语言的块。例如,如果你有一条匹配 /\.js$/ 的规则,那么它会应用到 .vue 文件里的 <script> 块  

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

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

相关文章

深入理解K均值算法:Python中的应用与实践

目录 写在开头1. K均值算法基础1.1 什么是K均值算法&#xff1f;1.2 K均值算法的工作原理1.3 算法的优势与局限性 2. K均值算法的实现步骤2.1 初始聚类中心的选择方法2.1.1 随机选择初始中心点2.1.2 K均值算法 2.2 数据点与聚类中心的距离计算2.2.1 欧氏距离计算2.2.2 曼哈顿距…

MySQL-----约束

目录​​​​​ 约束 一 主键约束 1-1 操作-添加单列主键 1-2 操作-添加多列主键 1-3 修改表结构添加主键 1-4 删除主键约束 二 自增长约束 2-1 指定自增长字段的初始值 2-2 删除自增列 三 非空约束 3-1 创建非空约束 3-2 删除非空约束 四 唯一约束…

寒假作业2月4号

第三章 类与构造函数 一&#xff0e;选择题 1、下列不能作为类的成员的是&#xff08;B&#xff09; A. 自身类对象的指针 B. 自身类对象 C. 自身类对象的引用 D. 另一个类的对象 2、假定AA为一个类&#xff0c;a()为该类公有的函数成员&#xff0c;x为该类的一个对象&am…

SpringCloud + Nacos环境下抽取Feign独立模块并支持MultipartFile

文章目录 一、前提条件和背景1. 前提2. 背景 二、Feign模块1. 依赖引入2. application.yaml配置3. 扩展支持MultipartFile4. 将media-api注册到feign 三、Media模块四、Content模块1. 引入依赖2. 启用FeignClient3. 测试 五、需要澄清的几点 一、前提条件和背景 1. 前提 已经…

Axure RP9原型设计工具使用记录:实际应用及问题记录

Axure RP9使用记录二 &#x1f4da;第三章 实际应用&#x1f4d7;快速归位00坐标&#x1f4d7;动态菜单&#x1f4d7;填充图片&#x1f4d7;下拉框联动&#x1f4d7;单选框&#x1f4d7;全局变量 ⁉️问题记录❓问题一&#xff1a;菜单不显示❗解决方式&#xff1a;调整菜单元件…

深入Spring MVC的工作流程

深入Spring MVC的工作流程 在Spring MVC的面试问题中&#xff0c;常常被询问到的一个问题。Spring MVC的程序中&#xff0c;HTTP请求是如何从开始到结束被处理的。为了研究这个问题&#xff0c;我们将需要深入学习一下Spring MVC框架的核心过程和工作流程。 1. 启动请求生命周…

【UE5 C++】超详细虚幻C++零基础学习教程

B站免费教程&#xff0c;虚幻C零基础教学入门级视频&#xff0c;帮助大家学习虚幻C。 视频地址&#xff1a;【虚幻5】UE5C零基础全网全流程开发从入门到进阶教程合集&#xff08;持续跟新中&#xff09;_哔哩哔哩_bilibili 课程介绍视频如下 【虚幻5】UE5C零基础全网全流程开…

[python]基于LSTR车道线实时检测onnx部署

【框架地址】 https://github.com/liuruijin17/LSTR 【LSTR算法介绍】 LSTR车道线检测算法是一种用于识别和定位车道线的计算机视觉算法。它基于图像处理和机器学习的技术&#xff0c;通过对道路图像进行分析和处理&#xff0c;提取出车道线的位置和方向等信息。 LSTR车道线…

Qt之使用Qt内置图标

一效果 二.原理 Qt内置图标封装在QStyle中,共七十多个图标,可以直接拿来用,能应付不少简单程序需求,不用自己去找图标并添加到资源文件了。 下面是内置图标的枚举定义: enum StandardPixmap {SP_TitleBarMenuButton,SP_TitleBarMinButton,SP_TitleBarMaxButton,SP_T…

PHP框架详解 - symfony框架

首先说一下为什么要写symfony框架&#xff0c;这个框架也属于PHP的一个框架&#xff0c;小编接触也是3年前&#xff0c;原因是小编接触Golang&#xff0c;发现symfony框架有PHP框架的东西也有Golang的东西&#xff0c;所以决定总结一下&#xff0c;有需要的同学可以参看小编的G…

【数据结构】链表OJ面试题(题库+解析)

前言 还不清楚链表的码喵们可以看看前篇关于链表的详解 http://t.csdnimg.cn/X6t6P 1.链表面试题 既然已经懂得了链表该如何实现&#xff0c;那么现在就趁热打铁开始练习&#xff01;这里给码喵们整理了相对不错的一些OJ题来练习 1. 删除链表中等于给定值 val 的所有结点。 力…

【Lambda表达式和函数式接口】

目录 Lambda表达式和函数式接口的使用具有以下几个影响&#xff1a;下面是一个简单的示例代码&#xff0c;使用Lambda表达式实现一个对列表进行遍历的操作&#xff1a; 在Java 8及以上版本中&#xff0c;Lambda表达式是一种函数式编程的特性&#xff0c;它可以使代码更加简洁、…

【Tomcat与网络2】一文理解Servlet是怎么工作的

在前面&#xff0c;我们研究了如何用idea来启动一个Servlet程序&#xff0c;今天我们就再来看一下Servlet是如何工作的。 目录 1.Servlet 介绍 2.Servlet 容器工作过程 3.Servlet的扩展 不管是电脑还是手机浏览器&#xff0c;发给服务端的就是一个 HTTP 格式的请求&#xf…

微信网页授权之使用完整服务解决方案

目录 微信网页授权能力调整造成的问题 能力调整的内容和理由 原有运行方案 is_snapshotuser字段 改造原有方案 如何复现测试场景 小结 微信网页授权能力调整造成的问题 依附于第三方的开发&#xff0c;做为开发者经常会遇到第三方进行规范和开发的调整&#xff0c;如开…

【EI会议征稿通知】2024年材料物理与复合材料国际学术会议

2024年材料物理与复合材料国际学术会议 2024 International Conference on Materials Physics and Composites(ICMPC 2024) 2024年材料物理与复合材料国际学术会&#xff08;ICMPC 2024&#xff09;将于2024年5月24-26日在中国成都举行。ICMPC 2024将吸引顶尖的研究人员和从业…

Python flask 模板详解

文章目录 1 概述1.1 模板简介1.2 templates 文件1.3 简单应用 2 模板语法2.1 for 循环2.2 if 判断 3 模板的继承3.1 格式要求3.2 实现示例3.3 复用父模板的内容&#xff1a;super 1 概述 1.1 模板简介 定义&#xff1a;定义好的 html 文件&#xff0c;用于快速开发 web 页面J…

【不单调的代码】还在嫌弃Ubuntu终端?快来试试做些Ubuntu终端的花式玩法。

&#x1f38a;专栏【不单调的代码】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Love Story】 &#x1f970;大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 注意&#xff1a; 本文是在Ubuntu环境下进…

Unity中blendtree和state间的过渡

混合树状态之间的过渡 如果属于此过渡的当前状态或下一状态是混合树状态&#xff0c;则混合树参数将出现在 Inspector 中。通过调整这些值可预览在混合树值设置为不同配置时的过渡表现情况。 如果混合树包含不同长度的剪辑&#xff0c;您应该测试在显示短剪辑和长剪辑时的过渡表…

明道云入选亿欧智库《AIGC入局与低代码产品市场的发展研究》

2023年12月27日&#xff0c;亿欧智库正式发布**《AIGC入局与低代码产品市场的发展研究》**。该报告剖析了低代码/零代码市场的现状和发展趋势&#xff0c;深入探讨了大模型技术对此领域的影响和发展洞察。其中&#xff0c;亿欧智库将明道云作为标杆产品进行了研究和分析。 明…

指针的学习2

目录 数组名的理解 使用指针访问数组 一维数组传参的本质 冒泡排序 二级指针 指针数组 指针数组模拟二维数组 数组名的理解 数组名是数组首元素的地址 例外&#xff1a; sizeof(数组名),sizeof中单独放数组名&#xff0c;这里的数组名表示整个数组&#xff0c;计算的…