初识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> 块  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql索引有哪些,如何分类

前言 按数据结构分类可分为&#xff1a;Btree索引、Hash索引、Full-text索引。 按物理存储分类可分为&#xff1a;聚簇索引、二级索引&#xff08;辅助索引&#xff09;。 按字段特性分类可分为&#xff1a;主键索引、普通索引、前缀索引。 按字段个数分类可分为&#xff1…

C++拷贝构造函数、赋值运算符重载

1.拷贝构造函数 拷贝构造函数的写法如图所示 调用方式如下 接下来我来说说它的特征 1.1特征 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器自动调用。 拷贝构造函…

推荐系统(Recommender Systems)

一、问题形式化 在接下来的内容中&#xff0c;我将开始讲解推荐系统的一些理论知识。我们从一个例子开始定义推荐系统&#xff0c;假使我们是一个电影供应商&#xff0c;我们有 5 部电影和 4 个用户&#xff0c;我们要求用户为电影打分 前三部电影是爱情片&#xff0c;后两部是…

GPT用来润色论文\生成完整长篇论文\进行AI绘图,真的太香了!

详情点击公众号&#xff1a;技术科研吧 链接&#xff1a;GPT用来润色论文\生成完整长篇论文\进行AI绘图&#xff0c;真的太香了&#xff01; 一&#xff1a;AI领域最新技术 1.OpenAI新模型-GPT-5 2.谷歌新模型-Gemini Ultra 3.Meta新模型-LLama3 4.科大讯飞-星火认知 5.百…

歌声悠扬如往昔

有一首歌 - 朱晓琳&#xff08;网易云单曲&#xff09; 作词 : 陈彼得作曲 : 陈彼得有一首歌我想起你那时候微风轻轻有一首歌我想起你你的感觉温馨有多少的欢笑就有多少的忧伤 愿时光在这里停住(好景不常在)歌声悠扬如往昔哦哦哦咿咿咿有一首歌我和你词意朦胧旋律依稀唱一首歌…

云端录制直播流视频,上传云盘

前言 哪一天我心血来潮&#xff0c;想把我儿子学校的摄像头视频流录制下来&#xff0c;并保存到云盘上&#xff0c;这样我就可以在有空的时候看看我儿子在学校干嘛。想到么就干&#xff0c;当时花了一些时间开发了一个后端服务&#xff0c;通过数据库配置录制参数&#xff0c;…

Vue引入Axios

1.命令安装axios和vue-axios npm install axios --save npm install vue-axios --save 2.package.json查看版本 3.在main.js中引用 import axios from axios; import VueAxios from vue-axios; Vue.use(VueAxios,axios) 4.如何使用 &#xff08;初始化方法&#xff09; 将下列代…

微信小程序实现时间轴效果

目录 引言时间轴效果的应用场景微信小程序的优势时间轴效果的设计思路时间轴界面布局数据结构设计实现时间轴效果WXML结构设计WXSS样式设计JavaScript逻辑实现说明引言 时间轴效果的应用场景 时间轴效果作为一种独特且直观的信息展示形式,已经被广泛应用于各种场景中,提供了…

2023年最受欢迎的4款绘图软件全面评测!

无论你是一个专业的插画家&#xff0c;还是一个有创造力的人&#xff0c;想要随时记录生活的灵感&#xff0c;现在你只需要拿起平板电脑或打开电脑浏览器来描述你脑海中的图片。在这篇文章中&#xff0c;我们选择了四个强大、方便和易于使用的绘图软件&#xff0c;其中一个必须…

【算法】{画决策树 + dfs + 递归 + 回溯 + 剪枝} 解决排列、子集问题(C++)

文章目录 1. 前言2. 算法例题46.全排列78.子集 1. 前言 dfs问题 我们已经学过&#xff0c;对于排列、子集类的问题&#xff0c;一般可以想到暴力枚举&#xff0c;但此类问题用暴力解法 一般都会超时&#xff0c;时间开销过大。对于该种问题&#xff0c;重点在于尽可能详细的 画…

【python】pyqt6信号与槽的代码与designer设置方法

pyqt6信号与槽的作用 整体过程 对象&#xff08;控件&#xff09;接收到一个信号&#xff08;类似clicked这样的函数&#xff09;&#xff0c;就会对接受者&#xff08;自身或者其他控件&#xff09;发出一个我被点击了的信息&#xff0c;然后这个接受者就会执行槽&#xff0…

计算机网络_1.6.3 计算机网络体系结构分层思想举例

1.6.3 计算机网络体系结构分层思想举例 1、实例引入&#xff08;用户在主机中使用浏览器访问web服务器&#xff09;2、从五层原理体系结构的角度研究该实例3、练习题 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 本节通过一个常见的网络应用实例&#xff0c;来介绍计…

代码混淆技术综述与优化方法

摘要 本文介绍了代码混淆的概念和目的&#xff0c;并提供了Python代码混淆的宏观思路。同时&#xff0c;还介绍了一种在线网站混淆Python代码的方法&#xff0c;并给出了混淆前后的示例代码。 引言 在当今信息时代&#xff0c;软件代码的保护显得尤为重要。代码混淆是一种常…

ReentrantLock相较于synchronized有哪些区别(一)?

ReentrantLock特点 相对于 synchronized 它具备如下特点 可中断 可以设置超时时间 可以设置为公平锁 支持多个条件变量 与 synchronized 一样&#xff0c;都支持可重入 基本使用语法如下&#xff1a; public class Test {public static void main(String[] args) {Reentran…

第十一章[文件系统]:11.2:文件的复制/删除/移动

一,相关文档: os模块: os --- 多种操作系统接口 — Python 3.12.1 文档源代码: Lib/os.py 本模块提供了一种使用与操作系统相关的功能的便捷式途径。 如果你只是想读写一个文件,请参阅 open() ,如果你想操作文件路径,请参阅 os.path 模块,如果你想读取通过命令行给出的所…

Java GC-常见垃圾回收器

目录 前言一、垃圾回收器分类二、垃圾回收器介绍1、Serial 收集器2、ParNew 收集器3、Parallel Scavenge 收集器4、Serial Old 收集器5、Parallel Old 收集器6、CMS 收集器&#xff08;多线程标记清除算法&#xff09;7、G1 收集器 三、项目中垃圾收集器选型 前言 Java的垃圾回…

蓝桥杯每日一题-----数位dp

前言 今天浅谈一下数位dp的板子&#xff0c;我最初接触到数位dp的时候&#xff0c;感觉数位dp老难了&#xff0c;一直不敢写&#xff0c;最近重新看了一些数位dp&#xff0c;发现没有想象中那么难&#xff0c;把板子搞会了&#xff0c;变通也会变的灵活的多&#xff01; 引入…

如何以管理员身份删除node_modules文件

今天拉项目&#xff0c;然后需要安装依赖&#xff0c;但是一直报错&#xff0c;如下&#xff1a; 去搜这个问题会让把node_modules文件先删掉 再去安装依赖。我在删除的过程中会说请以管理员身份来删除。 那么windows如何以管理员身份删除node_modules文件呢&#xff1f; wi…

Python绘制热力图

最近投SCI论文的时候&#xff0c;有些实验结果需要热力图展示&#xff0c;所以专门试了一下如何用python绘制热力图&#xff0c;发现简单好用&#xff0c;下面分享给大家具体方法。 一、安装python库 需要安装pandas、seaborn、matplotlib安装包依赖&#xff0c;均用pip一键安…

深入了解 Ansible:全面掌握自动化 IT 环境的利器

本文以详尽的篇幅介绍了 Ansible 的方方面面&#xff0c;旨在帮助读者从入门到精通。无论您是初学者还是有一定经验的 Ansible 用户&#xff0c;都可以在本文中找到对应的内容&#xff0c;加深对 Ansible 的理解和应用。愿本文能成为您在 Ansible 自动化旅程中的良师益友&#…