学习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,一经查实,立即删除!

相关文章

React Native中如何调用iOS的Face ID和Android的生物识别,react-native-biometrics

在React Native中调用Android和iOS的Face ID&#xff08;iOS特有&#xff09;或类似的功能&#xff08;如Android上的生物识别&#xff0c;通常是通过指纹或面部识别&#xff09;&#xff0c;你需要分别处理两个平台&#xff0c;因为这两个操作系统提供的API和框架不同。 对于…

Linux【基础指令汇总】

目录 Linux命令的特点 1、文件管理 ls命令 cp命令 mkdir命令 mv命令 pwd命令 2、文档编辑 cat命令 echo命令 rm命令 tail命令 rmdir命令 3、系统管理 rpm命令 find命令 startx命令 uname命令 vmstat命令 4、磁盘管理 df命令 fdisk命令 lsblk命令 hdpar…

C语言_回调函数和qsort

1. 回调函数 回调函数就是一个通过函数指针调用的函数。 通俗易懂些讲就是把函数的指针作为参数传递给另一个函数&#xff0c;当在另一个函数中通过这个指针调用其所指向的函数时&#xff0c;那这个通过指针被调用的函数就叫做回调函数。 先上一个模拟计算机的代码&#xff…

Docker安装mysql8并配置主从复制

1. 安装mysql8 1.1 新增挂载文件 # 新增mysql挂载文件夹 mkdir -p /root/docker/mysql/m01/log mkdir -p /root/docker/mysql/m01/data mkdir -p /root/docker/mysql/m01/conf1.2 新增mysql配置文件 # 新增mysql配置文件 cd /root/docker/mysql/m01/conf vim my.cnf # 下面是…

关于git分支冲突问题

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

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

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

Linux中的 `vi` 与 `vim` 使用详解

文章目录 Linux中的 vi 与 vim 使用详解1. vi 编辑器1.1 什么是 vi1.2 vi 的基本用法1.2.1 启动 vi1.2.2 模式1.2.3 基本操作1.2.4 常用命令 1.3 vi 的特点 2. vim 编辑器2.1 什么是 vim2.2 vim 的基本用法2.2.1 启动 vim2.2.2 模式2.2.3 vim 的增强功能2.2.4 vim 的基本操作 2…

如何选择合适的量化交易策略,回测与模拟交易的实战演练

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…

解决跨域问题的案列

JSONP&#xff08;JSON with Padding&#xff09; JSONP 是一种通过 <script> 标签的跨域请求方法&#xff0c;它依赖于服务器支持并返回特定格式的响应。 示例&#xff1a; 前端&#xff1a; <script> function jsonpCallback(data) {console.log(Received data:…

websocket初识

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在 WebSocket API 中&#xff0c;浏览器和服务器只需要完成一次握手&#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;还为企业和初…

编程题 7-15 计算圆周率【PAT】

文章目录 题目输入格式输出格式输入样例输出样例 题解解题思路完整代码 编程练习题目集目录 题目 根据下面关系式&#xff0c;求圆周率的值&#xff0c;直到最后一项的值小于给定阈值。 2 π 1 1 3 2 ! 3 5 3 ! 3 5 7 ​ n ! ​ 3 5 7 ⋯ ( 2 n 1 ) ⋯ {\frac 2…

安卓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。…

java技能

日志实际使用 log.error(“111”,e);和 System.out.println(ExceptionUtils.getStackTrace(error)); 日志查询 tail -f root.log 前端页面命名&#xff1a; mounted(){ document.title‘设备可视页面’ } 查看ips所属mac nbtstat -a 10.87.236.60 获取容器名称 hostName In…

POW 与 POS是什么?

POW 与 POS是什么? POW(Proof of Work)和POS(Proof of Stake)是区块链技术中两种常见的共识机制,它们在区块链网络中扮演着至关重要的角色,用于确保网络的安全性、去中心化和交易的验证。下面将分别详细解释这两种共识机制。 POW(工作量证明) 定义: POW,即工作量…

匿名管道 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…