当前位置:网站首页 > 深度学习 > 正文

webpack5学习与实战-(三)-引入其他资源模块

一,什么是资源模块

webpack除了引入js之外,还可以使用内置的资源模块(叫做assets modules),来引入任何的其他类型的资源。
webpack5 之前我们处理静态资源比如。图片字体之类的资源的时候等,需要用到url-loader,file-loader,raw-loader,webpack5则放弃了这三个loader,这三个loader在github上也停止了更新。
webpack5使用四种新增的资源模块(Asset Modules)替代了这些loader的功能。

asset/resource 将资源分割为单独的文件,并导出url,就是之前的 file-loader的功能. asset/inline 将资源导出为dataURL(url(data:))的形式,之前的 url-loader的功能. asset/source 将资源导出为源码(source code). 之前的 raw-loader 功能. asset 自动选择导出为单独文件或者 dataURL形式(默认为8KB). 之前有url-loader设置asset size limit 限制实现。 

二,asset/resource

将资源分割为单独的文件,并导出url

1,基本的配置

 module:{ 
    rules:[ { 
    test:/\.png$/,//正则匹配到png文件时,执行本策略 type:'asset/resource'//将其分割为单独的文件,并导出url(w文件路径) } ] } 

然后再在代码中写:

import hello from './hello' import imgSrc from './assets/boy.png'//把这个图片资源当作模块来引入,因为设置的是resource,所以返回的是这个文件的url hello() const img=document.createElement('img') img.src=imgSrc//只要这个变量的值是url,就可以了 document.body.appendChild(img) 

于是在浏览器中就可以看到图片了:
在这里插入图片描述

2,自定义asset module资源打包后的路径和名字

在output中配置:

assetModuleFilename:'images/[name]_[contenthash][ext]',//自定义asset module资源打包后的路径和名字 

其中

[name]:是该文件本身的名字 [contenthash]:是使用hash来命名文件 [ext]:是该文件自己的扩展名.png等 

这样配置之后打包出来,就会是这样的:
在这里插入图片描述

3,某种资源模块独有的路径和名字

上文中的配置,是在output中进行的资源文件的公共配置。除此之外,还可以在rule的对应资源中进行单独配置,并且这里的配置优先级更高,会覆盖上文的配置。

module:{ 
    rules:[ { 
    test:/\.png$/,//正则匹配到png文件时,执行本策略 type:'asset/resource',//将其分割为单独的文件,并导出url(w文件路径) generator:{ 
    filename:'images/[contenthash][ext]'//这里的配置优先级高于output中的assetModuleFilename } } ] } 

三,asset/inline

将资源导出为dataURL(url(data:))的形式

1,基本的配置

{ 
    test:/\.svg$/, type:'asset/inline', } 

然后使用svg:

import imgSvg from './assets/ship.svg' const svg= document.createElement('img') svg.src=imgSvg svg.style.cssText='height:1000px;width:1000px' document.body.appendChild(svg) 

打包之后,会发现在dist文件夹下并没有生成这个svg文件。而打开浏览器,浏览器上呈现的是这样的,这不是一个文件的路径,而是一个base64的数据:
在这里插入图片描述

四,asset/source

将资源导出为源码(source code)

1,基本配置

{ 
    test:/\.txt$/, type:'asset/source', } 
import text from './assets/example.txt' const textDiv=document.createElement('div') textDiv.textContent=text document.body.appendChild(textDiv) 

可以看到,它也没有在dist文件夹下生成文件,而是直接把源码放置到对应的位置。(可以理解为编译时,把这个资源文件的内容放置到对应的代码中了。)

五,asset:自动选择单独文件url或者dataUrl形式(8KB作为分界线)

asset 自动选择导出为单独文件或者 dataURL形式(默认为8KB)

1,基本配置

{ 
    test:/\.jpg$/, type:'asset', } 

然后在代码中写:

import jpgSrc from './assets/lufei.jpg'//把这个图片资源当作模块来引入,因为设置的是resource,所以返回的是这个文件的url const jpg=document.createElement('img') jpg.src=jpgSrc//只要这个变量的值是url,就可以了 document.body.appendChild(jpg) 

因为这张图片是30.56KB>8KB,所以采用的策略是导出为单文件的url,所以dist目录下会生成一个新的图片资源。
当我换一张小于8KB的图片的时候。就会转化成base64的形式了:
在这里插入图片描述

2,配置资源大小

{ 
    test:/\.jpg$/, type:'asset', generator:{ 
    filename:'images/[name]_[contenthash][ext]' }, parser: { 
    dataUrlCondition: { 
    maxSize: 4 * 1024*1024, }, }, } 

还可以设置函数来判断采取何种策略,更多的配置可以参考:https://webpack.docschina.org/configuration/module/#ruleparserdataurlcondition

六,本节中的webpack完整配置

const path = require("path");//这个是node内置的一个模块,用来操作文件路径的方法 const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { 
    entry: "./src/index.js",//设置打包入口 output: { 
    path: path.resolve(__dirname, "dist"),//设置打包的出口,需要是绝对路径,而__dirname是node的一个全局变量,记录当前文件的绝对路径 filename: "bundle.js",//设置打包出来的js的文件名 clean:true,//清除上次打包出来的文件 assetModuleFilename:'images/[contenthash][ext]',//自定义asset module资源打包后的路径和名字 }, devServer: { 
    static: "./dist" //执行dist作为根目录,这是本地服务器,打包的内容放置在内存中,然后静态资源指定为这个路径 }, devtool: "inline-source-map",//映射定位error和warning mode: "development",//设置打包的模式:开发/测试/生产,这个和process.env.NODE_ENV息息相关,我们在package.json中用命令行设置:webpack --mode=production plugins: [ new HtmlWebpackPlugin({ 
    template: "./index.html", //用来做模板的html的文件路径 filename: "index.html", //生成的html的名字 inject: "body" //打包出来的那个js文件,放置在生成的body标签内 }) ], module:{ 
    rules:[ { 
    test:/\.png$/,//正则匹配到png文件时,执行本策略 type:'asset/resource',//将其分割为单独的文件,并导出url(w文件路径) generator:{ 
    filename:'images/[name]_[contenthash][ext]' } }, { 
    test:/\.svg$/, type:'asset/inline', }, { 
    test:/\.txt$/, type:'asset/source', }, { 
    test:/\.jpg$/, type:'asset', generator:{ 
    filename:'images/[name]_[contenthash][ext]' }, parser: { 
    dataUrlCondition: { 
    maxSize: 4 * 1024*1024, }, }, } ] } }; 
到此这篇webpack5学习与实战-(三)-引入其他资源模块的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • webpack5学习与实战-(五)-直接加载资源2024-11-30 16:09:04
  • webpack5学习与实战-(七)-代码分离2024-11-30 16:09:04
  • webpack5学习与实战-(八)-配置打包后的文件名2024-11-30 16:09:04
  • webpack5学习与实战-(十二)-webpack模块与解析原理2024-11-30 16:09:04
  • canvas学习笔记2024-11-30 16:09:04
  • webpack5学习与实战-(一)-webpack的初步认识2024-11-30 16:09:04
  • 微信小程序学习笔记-(10)-猫眼电影案例2024-11-30 16:09:04
  • 微信小程序学习笔记-(9)-仿智行火车票2024-11-30 16:09:04
  • linux学习(linux怎样学)2024-11-30 16:09:04
  • 广度优先搜索和深度优先搜索的优缺点(深度与广度优先搜索)2024-11-30 16:09:04
  • 全屏图片