学习Webpack中图片-JS-Vue-plugin

目录

  • 图片文件
    • 资源模块类型
  • JS文件
    • babel
    • 命令行使用
    • babel-loader
    • babel-preset
  • Vue文件
    • vue-loader
    • @vue/compiler-sfc
  • plugin
    • CleanWebpackPlugin
    • HtmlWebpackPlugin
    • DefinePlugin

图片文件

需要先在项目中使用图片,比较常见的使用图片的方式是两种

  • img元素,设置src属性
  • 其他元素(比如div),设置background-imagecss属性

webpack5之前,加载这些资源需要使用一些loader,比如raw-loaderurl-loaderfile-loader

webpack5开始,我们可以直接使用资源模块类型asset module type),来替代上面的这些loader

资源模块类型

资源模块类型是指用于处理非 JavaScript 文件(例如 CSS、图像、字体等)的一种机制

常见的资源模块类型包括以下几种:

  • asset/resource
    在这里插入图片描述
    在这里插入图片描述

    • 用途用于将文件(如图像、字体等)导出为单独的文件,并返回该文件的 URL(即路径)

    • 作用类似于 file-loader,会在构建时将文件移到输出目录,最终导出的 JavaScript 会引用文件的 URL

    • 适用文件类型:图像(如 .png, .jpg),字体文件(如 .woff, .ttf),音视频文件等

  • asset/inline
    在这里插入图片描述
    在这里插入图片描述

    • 用途用于将文件(如小图像)以 Base64 字符串的形式嵌入到最终的 JavaScript 中,而不生成单独的文件

    • 作用类似于 url-loader,用于将文件转为 Data URLBase64 编码),适合小文件,以减少 HTTP 请求

    • 适用文件类型:小图像、字体等文件,尤其是文件较小的情况

  • asset/source
    在这里插入图片描述
    在这里插入图片描述

    • 用途用于导出文件的源代码内容,而不是将它们打包成单独的文件或 Base64 字符串

    • 作用类似于 raw-loader,返回文件的源代码内容作为 JavaScript 模块导出的字符串。适用于直接想以字符串形式引入文件内容的情况

    • 适用文件类型:文本文件(如 .txt, .svg, .md),CSS 或其他代码文件

  • asset
    在这里插入图片描述
    在这里插入图片描述

    • 用途一种通用的资源模块类型,它可以在 asset/resourceasset/inline 之间动态切换

    • 作用类似于 url-loaderWebpack 会根据文件大小自动选择是将文件作为资源输出还是内联到代码中。如果文件大小超过指定限制(默认是 8KB),它会导出为资源文件;否则会作为内联文件处理

    • 适用文件类型:图片、字体、音频、视频文件等

  • javascript/auto

    • 用途:这是 Webpack5 默认的 JavaScript 模块类型,用于处理 CommonJS、ES Modules 和其他类型的 JavaScript 文件

    • 作用:可以处理所有的 JavaScript 文件,并支持混合的模块类型(例如,既有 import 也有 require 的文件)

    • 适用文件类型.js, .cjs, .mjs 文件

  • javascript/esm

    • 用途:明确指定该模块只能使用 ECMAScript 模块(ESM)的模块类型

    • 作用:主要用于现代 JavaScriptES 模块化,importexport 语法

    • 适用文件类型:通常是 .mjs 文件,也可以是 .js 文件,但明确支持 ESM

上面主要介绍了四种处理图片的类型,打包图片时也可以加自定义设置:

  • 自定义文件的输出路径和文件名
    • 常用的占位符:

      [ext]: 处理文件的扩展名

      [name]:处理文件的名称

      [hash]:文件的内容,使用MD4的散列函数处理,生成的一个128位的hash值(32个十六进制)

    • 方式一: 修改output,添加assetModuleFilename属性

      const path = require("path");module.exports = {entry: "./src/index.js",output: {filename: "index.js",path: path.resolve(__dirname, "build"),assetModuleFilename: "img/[name].[hash:6][ext]", // 放img目录下 图片名字.hash的前六位 扩展名},module: {rules: [{test: /\.css$/,use: ["style-loader", "css-loader", "postcss-loader"],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|svg|jpg|jpeg|gif)$/i,type: "asset",},],},
      };
      

      在这里插入图片描述

    • 方式二:Rule中,添加一个generator属性,并且设置filename

      const path = require("path");module.exports = {entry: "./src/index.js",output: {filename: "index.js",path: path.resolve(__dirname, "build"),// assetModuleFilename: "img/[name].[hash:6][ext]", // 放img目录下 图片名字.hash的前六位 扩展名},module: {rules: [{test: /\.css$/,use: ["style-loader", "css-loader", "postcss-loader"],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|svg|jpg|jpeg|gif)$/i,type: "asset",generator: {filename: "image/[name].[hash:8][ext]",},},],},
      };
      

      在这里插入图片描述

  • 图片大小设置
    • 开发中往往是小的图片需要转换,但是大的图片直接使用图片即可

    • 是因为小的图片转换base64之后可以和页面一起被请求,减少不必要的请求过程

    • 大的图片也进行转换,反而会影响页面的请求速度

    • type修改为asset,添加一个parser属性,并且制定dataUrlCondition,添加maxSize属性

      const path = require("path");module.exports = {entry: "./src/index.js",output: {filename: "index.js",path: path.resolve(__dirname, "build"),},module: {rules: [{test: /\.css$/,use: ["style-loader", "css-loader", "postcss-loader"],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|svg|jpg|jpeg|gif)$/i,type: "asset",generator: {filename: "image/[name].[hash:8][ext]",},parser: {dataUrlCondition: {maxSize: 100 * 1024, // 这时使用的图片没有超过这个值他就不会被打包成文件,而是转base64使用},},},],},
      };
      

JS文件

开发中,想要使用ES6+的语法,想要使用TypeScript,开发React项目,这些文件的处理它们都是离不开Babel

babel

事实上,在开发中我们很少直接去接触babel,但是babel对于前端开发来说,目前是不可缺少的一部分,学习Babel对于我们理解代码从编写到线上的转变过程至关重要

Babel是一个工具链,主要用于旧浏览器或者环境中将ES6+``代码转换为向后兼容版本的JavaScript,包括语法转换、源代码转换等

命令行使用

babel本身可以作为一个独立的工具(和postcss一样),不和webpack等构建工具配置来单独使用

如果希望在命令行尝试使用babel,需要完成如下操作:

  • npm install @babel/cli @babel/core -D

    • @babel/corebabel的核心代码,必须安装

    • @babel/cli:可以让我们在命令行使用babel

  • npx babel src --out-dir dist:使用babel来处理源代码

    • src:是源文件的目录

    • --out-dir:指定要输出的文件夹dist

  • 拓展功能需要用到插件:

    • 比如需要转换箭头函数,那么就可以使用箭头函数转换相关的插件

      npm install @babel/plugin-transform-arrow-functions -D

      npx babel src --out-dir dist --plugins=@babel/plugin-transform-arrow-functions

    • 查看转换后的结果:会发现 const 并没有转成 var

      npm install @babel/plugin-transform-block-scoping -D

      npx babel src --out-dir dist --plugins=@babel/plugin-transform-block-scoping,@babel/plugin-transform-arrow-functions

    • 如果要转换的内容过多,一个个设置是比较麻烦的,可以使用预设(preset):

      npm install @babel/preset-env -D

      npx babel src --out-dir dist --presets=@babel/preset-env

babel-loader

在实际开发中,通常会在构建工具中配置babel来对其进行使用的,比如在webpack

  • 之前已经安装了@babel/core,不需要再次安装

  • npm install babel-loader -D

  • 可以设置一个规则,在加载js文件时,使用babel

babel-preset

如果一个个去安装使用插件,需要手动来管理大量的babel插件,可以直接给webpack提供一个presetwebpack 会根据预设来加载对应的插件列表,并且将其传递给babel

  • 常见的预设有三个:env,react,TypeScript

  • 安装preset-envnpm install @babel/preset-env

  • 添加wk.config.js配置

    const path = require("path");module.exports = {entry: "./src/index.js",output: {filename: "index.js",path: path.resolve(__dirname, "build"),},module: {rules: [{test: /\.css$/,use: ["style-loader", "css-loader", "postcss-loader"],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|svg|jpg|jpeg|gif)$/i,type: "asset",generator: {filename: "image/[name].[hash:8][ext]",},parser: {dataUrlCondition: {maxSize: 100 * 1024, // 这时使用的图片没有超过这个值他就不会被打包成文件,而是转base64使用},},},{test: /\.m?js$/,use: [{loader: "babel-loader",options: {// presets: [//   [//     "@babel/preset-env",//     {//       targets: "> 0.25%, not dead",//       useBuiltIns: "usage",//       corejs: 3,//     },//   ],// ],presets: ["@babel/preset-env"],},},],},],},
    };
    

Vue文件

  • 编写vue代码
    // app.vue
    <template><div class="box-vue"><h2>hello vue</h2><p>哈哈哈哈哈</p></div>
    </template><script setup></script><style>.box-vue {width: 100px;height: 100px;background: cyan;}
    </style>// index.js
    import "./style.css";
    import "./style.less";
    import "./bgImg.css";
    import App from "./app.vue";
    import { createApp } from "vue/dist/vue.esm-bundler.js";
    const img = require("./images/2.jpg");const divEl = document.createElement("div");
    divEl.innerHTML = `<div class='box-css'>hello css</div><div class='box-less'>hello less</div><div class='bgImg'></div><image class='img' src='${img}' />`;
    divEl.className = "box";
    document.body.appendChild(divEl);createApp(App).mount("#app");
    
  • 打包会报错,我们需要安装vue-loader在这里插入图片描述

vue-loader

  • npm install vue-loader -D:安装vue-loader

  • 添加配置wk.config.js{ test: /\.vue$/, loader: "vue-loader" }

  • 这时在打包依然会报错,因为需要添加 @vue/compiler-sfc 来对template进行解析
    在这里插入图片描述

@vue/compiler-sfc

  • npm install @vue/compiler-sfc -D:安装@vue/compiler-sfc,如果安装vue时自动安装了就不需要安装了

  • 需要配置对应的Vue插件:

    const path = require("path");
    const { VueLoaderPlugin } = require("vue-loader/dist/index");module.exports = {entry: "./src/index.js",output: {filename: "index.js",path: path.resolve(__dirname, "build"),},plugins: [new VueLoaderPlugin()],module: {rules: [{test: /\.css$/,use: ["style-loader", "css-loader", "postcss-loader"],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|svg|jpg|jpeg|gif)$/i,type: "asset",generator: {filename: "image/[name].[hash:8][ext]",},parser: {dataUrlCondition: {maxSize: 100 * 1024, // 这时使用的图片没有超过这个值他就不会被打包成文件,而是转base64使用},},},{test: /\.m?js$/,use: [{loader: "babel-loader",options: {presets: ["@babel/preset-env"],},},],},{test: /\.vue$/,loader: "vue-loader",},],},
    };
    

plugin

上面打包vue我们引入了个新的知识插件,接下来学习plugin相关内容

Webpack的另一个核心是Plugin,官方有这样一段对Plugin的描述:
在这里插入图片描述

  • Loader是用于特定的模块类型进行转换

  • Plugin除了loader功能其他都可以做,可以用于执行更加广泛的任务,比如打包优化、资源管理、环境变量注入等

在这里插入图片描述

CleanWebpackPlugin

前面练习的过程中,每次修改了一些配置,重新打包时都需要手动删除dist文件夹,可以借助于一个插件来帮助完成就是 CleanWebpackPlugin

  • npm install clean-webpack-plugin -D:安装
  • 在wk.config.js中配置
    在这里插入图片描述
  • 可以使用Webpack5 内置的 clean 功能https://webpack.docschina.org/configuration/output/#outputclean
    在这里插入图片描述
  • 我们可以先在你打包后的文件夹创建个abc.js,然后配置完执行打包命令就可以看到它会把你打包文件夹下的abc.js删除

HtmlWebpackPlugin

我们的HTML文件是编写在根目录下的,最终打包的build文件夹中是没有index.html文件,但在进行项目部署的时,必然是需要有对应的入口文件index.html,所以也需要对index.html进行打包处理

  • npm install html-webpack-plugin -D:对HTML进行打包处理使用另外一个插件:HtmlWebpackPlugin

  • 配置wk.config.js
    在这里插入图片描述

  • 执行打包命令后,发现自动在build文件夹中,生成了一个index.html的文件,该文件中也自动添加了我们打包的index.js文件

  • html默认情况下是根据ejs的一个模板来生成的,在html-webpack-plugin的源码中,有一个default_index.ejs模块
    在这里插入图片描述

  • 也可以修改打包index.html的内容

    • 自定义HTML模板

      比如添加一个noscript标签,在用户的JavaScript被关闭时,给予相应的提示

      比如在开发vue或者react项目时,我们需要一个可以挂载后续组件的根标<div id="app">
      在这里插入图片描述

    • 自定义模板数据填充

      上面的html中,会有一些类似这样的语法<% 变量 %>,这个是EJS模块填充数据的方式

      title:可以在进行htmlWebpackPlugin.options.title读取时,就会读到该信息

      template:指定我们要使用的模块所在的路径

      filename:生成的HTML文件名

      inject:插入打包的资源文件,默认值为 true。可以设置为 'head''body' 来指定资源注入的位置。

      minify:对生成的 HTML 进行压缩(常用于生产环境) collapseWhitespace: 去除空白,removeComments: 移除注释,removeAttributeQuotes: 移除属性的引号

  • 配置wk.config.js并打包

    // ./public/index.html
    <!DOCTYPE html>
    <html lang="en"><head><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><metaname="viewport"content="width=device-width,initial-scale=1.0,user-scalable=no"/><link rel="icon" href="<%= BASE_URL %>favicon.ico"><title><%= htmlWebpackPlugin.options.title %></title></head><body><noscript><strong>We're sorry but <%= webpackConfig.name %> doesn't work properly withoutJavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body>
    </html>// wk.config.js
    const path = require("path");
    const { VueLoaderPlugin } = require("vue-loader/dist/index");
    const { CleanWebpackPlugin } = require("clean-webpack-plugin");
    const HtmlWebpackPlugin = require("html-webpack-plugin");module.exports = {entry: "./src/index.js",output: {filename: "index.js",path: path.resolve(__dirname, "build"),},plugins: [new VueLoaderPlugin(),new CleanWebpackPlugin(),new HtmlWebpackPlugin({title: "haahha",template: "./public/index.html",filename: "main.html",minify: {collapseWhitespace: true, // 移除空白removeComments: true, // 移除注释removeAttributeQuotes: true, // 移除属性的引号},}),],module: {rules: [{test: /\.css$/,use: ["style-loader", "css-loader", "postcss-loader"],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|svg|jpg|jpeg|gif)$/i,type: "asset",generator: {filename: "image/[name].[hash:8][ext]",},parser: {dataUrlCondition: {maxSize: 100 * 1024, // 这时使用的图片没有超过这个值他就不会被打包成文件,而是转base64使用},},},{test: /\.m?js$/,use: [{loader: "babel-loader",options: {presets: ["@babel/preset-env"],},},],},{test: /\.vue$/,loader: "vue-loader",},],},
    };
    

    在这里插入图片描述

我们配置完打包发现还是报错,因为在模块中还使用到一个BASE_URL的常量,要用到下面的插件

DefinePlugin

在模块中还使用到一个BASE_URL的常量,但是我们并没有设置过这个常量值,所以会出现没有定义的错误,这个时候可以使用DefinePlugin插件

  • DefinePlugin允许在编译时创建配置的全局常量,是一个webpack内置的插件(不需要单独安装)

  • wk.config.js配置再打包就可以取到BASE_URL不会报错了
    在这里插入图片描述

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

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

相关文章

关于git分支冲突问题

什么是冲突 在Git中&#xff0c;冲突是指两个或多个开发者对同一文件统一部份进行了不同的修改&#xff0c;并且在合并这些修改时&#xff0c;Git无法自动确定应该采用哪种修改而产生的情况。 分支冲突 如何出现并解决 在一个版本时&#xff0c;有一个master分支&#xff0c…

如何使用WinRAR锁定压缩文件,防止文件被修改或删除?

在日常工作中&#xff0c;我们经常需要分享压缩文件&#xff0c;但也可能面临文件被修改或删除的风险。想要保护压缩文件的完整性&#xff0c;不妨使用WinRAR提供的“锁定压缩文件”功能。这个功能可以防止文件被意外更改或删除&#xff0c;确保压缩文件保持原样。下面一起来看…

【Android 14源码分析】Activity启动流程-1

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

Llama 3.2:利用开放、可定制的模型实现边缘人工智能和视觉革命

在我们发布 Llama 3.1 模型群后的两个月内&#xff0c;包括 405B - 第一个开放的前沿级人工智能模型在内&#xff0c;它们所产生的影响令我们兴奋不已。 虽然这些模型非常强大&#xff0c;但我们也认识到&#xff0c;使用它们进行构建需要大量的计算资源和专业知识。 我们也听到…

Meta首款多模态Llama 3.2开源:支持图像推理,还有可在手机上运行的版本 | LeetTalk Daily...

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 Meta最近推出的Llama Stack的发布标志着一个重要的里程碑。这一新技术的推出不仅为开发者提供了强大的多模态能力&#xff0c;还为企业和初…

安卓13设置删除网络和互联网选项 android13隐藏设置删除网络和互联网选项

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1修改方法14.2修改方法25.编译6.彩蛋1.前言 有些客户不想让用户修改默认的网络配置,禁止用户进入里面调整网络相关的配置。 2.问题分析 像这个问题,我们有好几种方法去处理,这种需求一般…

IDEA Dependency Analyzer 分析 maven 项目包的依赖

一、场景分析 javax.validation 是我们 SpringMVC 常用的数据校验框架。但是 javax.validation 是一个规范&#xff08;Java Bean Validation&#xff0c;简称 JSR 380&#xff09;&#xff0c;它并没有具体的实现&#xff0c;它的常用实现&#xff0c;是hibernate-validator。…

匿名管道 Linux

管道 首先自己要用用户层缓冲区&#xff0c;还得把用户层缓冲区拷贝到管道里&#xff0c;&#xff08;从键盘里输入数据到用户层缓冲区里面&#xff09;&#xff0c;然后用户层缓冲区通过系统调用&#xff08;write&#xff09;写到管道里&#xff0c;然后再通过read系统调用&…

[leetcode] 70. 爬楼梯

文章目录 题目描述解题方法动态规划java代码复杂度分析 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1…

城市轨道交通网络客流大数据可视化分析系统----以某市交通网络客流数据为例

1 引言 1.1研究背景、目的与意义 1.1.1研究背景 城市轨道交通系统是现代城市的重要交通方式之一&#xff0c;随着城市化进程的加速和人口增长&#xff0c;轨道交通系统的客流量不断增加。因此&#xff0c;轨道交通部门和相关企业需要对客流数据进行实时监测和分析&#xff0…

BERT训练之数据集处理(代码实现)

目录 1读取文件数据 2.生成下一句预测任务的数据 3.预测下一个句子 4.生成遮蔽语言模型任务的数据 5.从词元中得到遮掩的数据 6.将文本转化为预训练数据集 7.封装函数类 8.调用 import os import random import torch import dltools 1读取文件数据 def _read_wiki(data_d…

可视化是工业互联网的核心技术之一,都有哪些应用场景?

一、工业互联网是什么&#xff0c;发展的来胧去脉 工业互联网是指利用互联网技术和物联网技术&#xff0c;将工业生产中的各种设备、机器、传感器等进行互联互通&#xff0c;实现信息的实时采集、传输和分析&#xff0c;从而实现生产过程的智能化、自动化和高效化。 工业互联网…

工业交换机一键重启的好处

在当今高度自动化和智能化的工业环境中&#xff0c;工业交换机作为网络系统中至关重要的一环&#xff0c;其稳定性和可靠性直接影响到整个生产过程的顺利进行。为了更好地维护这些设备的健康运行&#xff0c;一键重启功能应运而生&#xff0c;并呈现出诸多显著的好处。 首先&am…

Mixture-of-Experts (MoE): 条件计算的诞生与崛起【下篇】

将 Mixture-of-Experts 应用于 Transformers 既然我们已经研究了条件计算的早期工作&#xff0c;那么我们就可以看看 MoE 在变换器架构中的一些应用。 如今&#xff0c;基于 MoE 的 LLM 架构&#xff08;如 Mixtral [13] 或 Grok&#xff09;已广受欢迎&#xff0c;但 MoE 在语…

【Python】数据可视化之点线图

目录 散点图 气泡图 时序图 关系图 ​​​​​​​ 散点图 Scatterplot&#xff08;散点图&#xff09;是一种用于展示两个变量之间关系的图表类型。在散点图中&#xff0c;每个观测值&#xff08;或数据点&#xff09;都被表示为一个点&#xff0c;其中横轴&#xff08;…

手机USB连接不显示内部设备,设备管理器显示“MTP”感叹号,解决方案

进入小米驱动下载界面&#xff0c;等小米驱动下载完成后&#xff0c;解压此驱动文件压缩包。 5、小米USB驱动安装方法&#xff1a;右击“计算机”&#xff0c;从弹出的右键菜单中选择“管理”项进入。 6、在打开的“计算机管理”界面中&#xff0c;展开“设备管理器”项&…

Linux下驱动开发实例

驱动开发 驱动与硬件的分离 在传统的嵌入式系统开发中&#xff0c;硬件信息往往是直接硬编码在驱动代码中的。这样做的问题是&#xff0c;当硬件发生变化时&#xff0c;比如增加或更换设备&#xff0c;就需要修改驱动程序的代码&#xff0c;这会导致维护成本非常高。因此&…

从自动化到智能化:AI如何推动业务流程自动化

引言&#xff1a;从自动化到智能化的必然趋势 在当今数字化时代&#xff0c;企业为了提升效率、降低成本&#xff0c;纷纷采用自动化技术来简化重复性任务。然而&#xff0c;传统自动化仅限于标准化操作&#xff0c;无法应对复杂的决策和多变的市场环境。随着人工智能&#xff…

通信工程学习:什么是MAI多址干扰

MAI:多址干扰 MAI多址干扰(Multiple Access Interference)是无线通信领域,特别是在码分多址(CDMA)系统中,一个关键的干扰现象。以下是对MAI多址干扰的详细解释: 一、定义 多址干扰是指在CDMA系统中,由于多个用户的信号在时域和频域上是混叠的,从而导…

《程序猿之Redis缓存实战 · 哈希类型》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…