Vue3和TypeScript学习笔记coderwhyDay07之webpack打包其他资源

以下仅了解基本使用方法,现实中使用时多查官方文档和github

loader

file-loader(弃)

在这里插入图片描述

处理jps、png等格式图片,对应的loader为file-loader
1.安装npm install file-loader -D
2.配置处理图片的url

 {
	test: /\.(png|jpe?g|gif|svg)$/i,
	use: {
          loader: "file-loader"
	 }
}

打包完后,dist下多出一个图片。
我们会发现图片的名称是一串复杂数字,那么,我们要不要把引入的图片路径进行更改呢?不需要。webpack帮我们做了这些事情。
注意:修改一次源代码就要重新打包

对于div元素设置background-image的css属性来加载图片,以上方式完全OK。但是,如果使用img元素的src属性来加载图片,我们需要把图片资源模块化。
import/require()方式引入一个文件资源,并且会将它放到我们输出的文件夹

//import导入图片资源
import zzhnImage from '../img/zznh.png';

// 设置img元素的src
const imgEl = document.createElement('img');
imgEl.src = zzhnImage;

document.body.appendChild(imgEl);

那么,怎样做才能图片导出到指定文件夹并对图片命名?
开发中,我们会遇到相同名字的不同图片,使用hash值有效防止图片名字的重复。

 {
        test: /\.(jpe?g|png|gif|svg)$/,
        use: {
          loader: "file-loader",
          options: {
            // outputPath: "img",
            //name:"[name]_[hash:6].[ext]" //这两条等价于下面name
            //图片被打包到build/img下
            name: "img/[name]_[hash:6].[ext]"
          }
        }
      }

url-loader(弃)

url-loader和file-loader工作方式是相似的,但是可以将较小的文件,转成base64的URI
npm install url-loader -D

当我们向服务器发送请求时,可能会传过去很多图片资源,每张图片都进行请求,造成服务器请求压力。
可以进行优化。
精灵图:多张小图片整合到一张图片上,这样就减少了图片请求次数。
将图片转成base64URI,在js或css中使用,顺带传过去,浏览器进行相应解析,也减少图片请求次数。

url-loader可以替换file-loader

      {
        test: /\.(jpe?g|png|gif|svg)$/,
        use: {
          loader: "url-loader",
          options: {
            //图片被打包到build/img下
            name: "img/[name]_[hash:6].[ext]",
            //小于100kb的图片进行base64编码
            limit: 100 * 1024 
          }
        }
      },

asset module type(推荐)

注意:
webpack5中file-loader和url-loader都不在使用了
最新方式不用下载loader了

在webpack5之前,加载资源使用一些loader,比如raw-loader、url-loader、file-loader
在webpack5之后,我们直接使用资源模块类型(asset module type)来代替上面的这些loader

**资源模块类型(asset module type)**通过添加4种新的模块类型,来替换这些loader
asset/resource发送一个单独的文件并导出URL 之前通过file-loader实现
asset/inline导出一个资源的data URI,之前使用url-loader实现
asset/source导出资源的源代码, 之前raw-loader
asset在导出data URI和发送一个单独的文件中自动选择

 {
        test: /\.(jpe?g|png|gif|svg)$/,
        type: "asset",
        generator: {
          filename: "img/[name]_[hash:6][ext]"
        },
        parser: {
          dataUrlCondition: {
            maxSize: 100 * 1024
          }
        }
      }

字体打包

特殊的字体或者字体图标,引入相关的字体文件
处理eot、ttf、woff等文件

1.使用file-loader

      {
        test: /\.(eot|ttf|woff2?)$/,
        use: {
          loader: "file-loader",
          options: {
            // outputPath: "font",
            name: "font/[name]_[hash:6].[ext]"
          }
        }
      }

2.asset/resource方式

      {
        test: /\.(eot|ttf|woff2?)$/,
        type: "asset/resource",
        generator: {
          filename: "font/[name]_[hash:6][ext]"
        }
      }

注意细节:file-loader中打包名字的是name
asset/resource用的是filename


Plugin

每次打新的包,都要把原来产生的文件删掉。可是,每次手动删都很麻烦,怎么办?我们可以使用插件。
Loader是用于特定的模块类型进行转换
Plugin可以用于执行更加广泛的任务,比如打包优化、资源管理、环境变量注入等
loader帮我们加载某些模块


CleanWebpackPlugin

用途:自动删除dist文件夹,重新打包
1.安装npm install clean-webpack-plugin -D
2.webpack.config.js手动导入并配置
我们之前在使用loader时并不需要手动导入

const { CleanWebpackPlugin } = require("clean-webpack-plugin");

module.exports={
	//其他配置
	plugins: [
    new CleanWebpackPlugin(),
	]
}

HtmlWebpackPlugin

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

1.安装
npm install html-webpack-plugin -D
2.引入并配置

const HtmlWebpackPlugin = require("html-webpack-plugin");

new HtmlWebpackPlugin({
      title: "哈哈哈哈"
})

我们会发现自动在dist文件夹下生成了一个index.html文件。该文件自动添加了我们打包生成的bundle.js文件


DefinePlugin

自定义HTML模板
如果我们想要在自己的模板中添加一些比较特别的内容:
noscript标签,在用户的JavaScript被关闭时,给予响应的提示
开发vue或者react项目时,我们需要一个可以挂载后续组件的根标签

这就需要我们有一个属于自己的index.html模板
语法<% 变量 %>,这个是EJS模块填充数据的方式
在编译template模板时,需要插件DefinePlugin。允许在编译时创建配置的全局变量,是webpack内置的插件(不需要安装)

<!--通过definePlugin配置全局常量 BASE_URL-->
 <link rel="icon" href="<%= BASE_URL %>favicon.ico">
<!--通过htmlwebpackplugin配置 title-->
 <title><%= htmlWebpackPlugin.options.title %></title>

const HtmlWebpackPlugin = require("html-webpack-plugin");
plugins: [
    new HtmlWebpackPlugin({
    //指定要使用模板所在路径
      template: "./public/index.html",
     //读取htmlWebpackPlugin.options.title时会读到title信息
      title: "哈哈哈哈"
    }),
    new DefinePlugin({
      BASE_URL: "'./'"
    }),
  ]

CopyWebpackPlugin

在vue打包过程中,将一些文件放到public目录下,这个目录会被复制到dist文件夹中。这个复制的功能,可以使用CopyWebpackPlugin。
1.安装
npm install copy-webpack-plugin -D
2.导入并配置
from:设置从哪一个源中开始复制
to:复制到的位置,可省略,默认复制打包到的目录下
globOptions:设置额外的选项

const CopyWebpackPlugin = require('copy-webpack-plugin');

 new CopyWebpackPlugin({
      patterns: [
        {
          from: "public",
          to: "./",
          globOptions: {
            ignore: [
            //已经通过htmlwebpackplugin完成index.html生成,不需要复制html模板了
              "**/index.html"
            ]
          }
        }
      ]
    }

Mode配置

我们前面操作中,不难发现一个问题。源码错了再进行打包,那么所有代码打包到一行,看浏览器调试信息,不知道哪里出错,很难定位。
怎么解决呢?我们应该尝试让打包的bundle.js尽量能看到

webpack添加一个配置。设置为开发模式和source-map
source-map作用:生成对应源代码时也生成对应的map文件。
这样,我们浏览器显示报错信息的时候就会映射到确定的错误位置。

webpack.config.js配置

module.exports = {
  // 设置模式
  // development 开发阶段, 会设置development
  // production 准备打包上线的时候, 设置production
  mode: "development",
  // 设置source-map, 建立js映射文件, 方便调试代码和错误
  devtool: "source-map"
 
 //更多配置
}

补充笔记
注意:插件的使用没有书写顺序
CleanWebpackPlugin:自动删除dist文件夹,重新打包
HtmlWebpackPlugin:对html打包处理
DefinePlugin:允许在编译时创建配置的全局变量,是webpack内置的插件
CopyWebpackPlugin:放到public目录下,这个目录会被复制到dist文件夹中


  • 以上仅是简单入门了解,更多内容看官网配置
    webpack官网文档
  • 以上笔记参考coderwhy老师的Vue3和TypeScript。
    老师讲课链接:课程链接
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值