学习webpack系列之二 ---- (管理静态资源)

本文的项目代码是基于上一篇文章延续下来的。
在开始之前,让我们对项目做一个小的修改:
把dist/index.html里面的main.js改为bundle.js
把webpack.config.js里面的output改为bundle.js
这么做的目的只是为了使代码看起来更加符合语义一点,阅读起来比较舒服,没有什么特别的含义。

css、images、fonts都是项目的必备资源,所以webpack为了加载这些静态资源,是必须引入部分loaders的,这个就不用纠结为什么要引入这些loaders了的。

所以我们只需要学习如何使用loaders去加载一些我们自己后面项目里面添加的资源即可。

一、加载CSS

论在前端开发的过程中,但凡我们在框架内使用CSS,基本上都是使用import来引入一个CSS文件的。

这里插一句,ES2015 中的 import 和 export 语句已经被标准化。虽然大多数浏览器还无法支持它们,但是 webpack 却能够提供开箱即用般的支持。
事实上,webpack 在幕后会将代码 “转译”,以便旧版本浏览器可以执行,而转译的过程中,运用的正是本文提及的loaders们。
标志性的有babel-loader,大家自行查阅官网,这里不再赘述。

为了import项目需要的CSS文件,我们需要安装style-loadercss-loader,并在 module 配置 中添加这些 loader:

npm install --save-dev style-loader css-loader

webpack.config.js写入依赖模块代码:

 const path = require('path');module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist'),},module: {rules: [{test: /\.css$/i,// 链式调用,逆序执行,保证loaders的先后顺序,否则报错。// 第一个 loader 将其结果(被转换后的资源)传递给下一个 loader,依此类推。// 所以首先处理CSS文件的css-loader就放在最后,接着再是style-loader。use: ['style-loader', 'css-loader']},],},};

添加完,测试一下新添加一个style.css文件,观察有没有被编译,项目路径配置如下:

  |- package.json|- webpack.config.js|- /dist|- bundle.js|- index.html|- /src|- style.css|- index.js|- /node_modules

style.css键入以下代码:

.hello {color: red;
}

index.js内补充以下代码:

import _ from 'lodash';
import './style.css';function component() {const element = document.createElement('div');element.innerHTML = _.join(['Hello', 'webpack'], ' ');// 动态添加CSS样式element.classList.add('hello');return element;
}document.body.appendChild(component());

这里补充一下,我们使用JavaScript为dom操作一些步骤的时候,都是动态操作的,所以一些资源在检查网页源代码的时候是无法查看的,这点应该不难理解。

现在可以使用我们上一篇文章配置好的npm script 对项目进行编译试试看,注意查看命令行的提示:


可以看到这里webpack引用了两个loaders,而且对style.css文件成功的进行了编译,接下来查看一下网页效果,不出意外style应该是生效了,渲染为红色的字体:

二、加载images

编译图片类静态资源,我们只需要应用webpack内置的Asset Modules loader即可,我们继续在webpack.config.js里面添加loaders 的配置:

 const path = require('path');module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist'),},module: {rules: [...// 新增处理图片类静态资源loader{test: /\.(png|svg|jpg|jpeg|gif)$/i,// webpack内置asset module loadertype: 'asset/resource',},],},};

然后继续在style.css 里面添加关于图片的样式:

.hello {color: red;font-family: 'MyFont';// 随便添加图片就行,跟此css文件保持同一目录background: url('./timg.gif');background-size: 100% 100%;height: 500px;
}

接着同样执行npm run build ,观察命令行和网页的效果:


可以看到命令行里面只显示了编译结果,并没有显示使用了什么loader,因为我们引用的是内置loader,所以webpack并不需要将其纳入依赖关系图里面。

三、加载fonts

编译fonts类字体文件,跟编译图片类的流程差不多,都是使用webpack内置的Asset module loader,并不需要去下载其他loader,很方便:

 const path = require('path');module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist'),},module: {rules: [...// 此处新增处理fonts字体类文件loader{test: /\.(woff|woff2|eot|ttf|otf)$/i,type: 'asset/resource',},],},};

然后,我们去新增一个my-font.woff字体文件测试一下,可以不填写内容,我们只需要看编译结果就可以了。项目配置如下:

  |- package.json|- webpack.config.js|- /dist|- bundle.js|- index.html|- /src|- my-font.woff|- my-font.woff2|- icon.png|- style.css|- index.js|- /node_modules

接着,也是在style.css 文件里面,添加对应的引入:

@font-face {font-family: 'MyFont';src: url('./my-font.woff') format('woff'), url('./my-font.woff2') format('woff2');font-weight: 600;font-style: normal;
}.hello {color: red;font-family: 'MyFont';background: url('./timg.gif');background-size: 100% 100%;height: 400px;
}

最后,执行npm run build 编译项目,查看命令行和网页的效果:


大概就是酱紫。

可能到这一步会有小伙伴产生疑问,加入我新增文件之后,不引入的话,会有什么结果?
我们不妨动手来操作一下,打破砂锅问到底嘛!实践得出真理!

我们把style.css 文件内与fonts有关的内容全部删掉,执行npm run build ,看看有什么效果吧!让我们先删除fonts的相关代码:

执行npm run build

可以看到webpack是完全没有编译跟fonts有关的依赖的,因为webpack是按需加载,根本不会把fonts纳入依赖关系图之内。

四、实践、加载数据

经过以上3个loaders的介绍,我相信你现在已经对管理静态资源有了充分的了解了,所以这里我们趁热打铁,自己动手学习一下对其他类型文件要怎么编译处理吧!

新增data.xmldata.csv文件,项目配置如下:

  |- package.json|- webpack.config.js|- /dist|- bundle.js|- index.html|- /src|- data.xml|- data.csv|- my-font.woff|- my-font.woff2|- icon.png|- style.css|- index.js|- /node_modules

/src/data.xml

<?xml version="1.0" encoding="UTF-8"?>
<note><to>Mary</to><from>John</from><heading>Reminder</heading><body>Call Cindy on Tuesday</body>
</note>

/src/data.csv

to,from,heading,body
Mary,John,Reminder,Call Cindy on Tuesday
Zoe,Bill,Reminder,Buy orange juice
Autumn,Lindsey,Letter,I miss you

data.xmldata.csv进行引入:

import Data from './data.xml';
import Notes from './data.csv';function component() {console.log(Data);console.log(Notes);return element;}document.body.appendChild(component());

先执行npm run build 编译一下,看是什么结果:

很棒,报错了。谁让你没有引入loader呢对吧?webpack是识别不了这两种文件格式的。接下来添加loader配置:
先安装对应的package

npm install --save-dev csv-loader xml-loader

添加loader配置:

 const path = require('path');module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist'),},module: {rules: [{test: /\.(csv|tsv)$/i,use: ['csv-loader'],},{test: /\.xml$/i,use: ['xml-loader'],}],},};

再编译一下,看效果:


真的是,非常棒呢!
(md好鸡儿累,求求关注点赞叭大佬们~)

学习webpack系列之二 ---- (管理静态资源)相关推荐

  1. BizTalk学习笔记系列之二:实例说明如何使用BizTalk

    BizTalk学习笔记系列之二:实例说明如何使用BizTalk --.BizTalk学习笔记系列之二<?XML:NAMESPACE PREFIX = O /> Aaron.Gao,2006 ...

  2. 如何在React Native中构建项目并管理静态资源

    by Khoa Pham 通过Khoa Pham 如何在React Native中构建项目并管理静态资源 (How to structure your project and manage stati ...

  3. SpringBoot学习笔记(3):静态资源处理

    SpringBoot学习笔记(3):静态资源处理 在web开发中,静态资源的访问是必不可少的,如:Html.图片.js.css 等资源的访问. Spring Boot 对静态资源访问提供了很好的支持, ...

  4. 基于Proteus学习单片机系列(二)——驱动数码管

    获取更多资源,请关注微信公众号:嵌入式基地 获取项目资源:公众号后台回复:单片机仿真 基于Proteus学习单片机系列(一)--点亮LED 基于Proteus学习单片机系列(二)--驱动数码管 基于P ...

  5. webjars管理静态资源

    webjars用途简单解释 :   利用Servlet3协议规范中,包含在JAR文件/META-INF/resources/路径下的资源可以直接被web访问到这一原理,将前端静态资源打成jar包方便管 ...

  6. 通过自定义组件学习Vue系列(二)【时间轴】(附源码)

    需求: 用于升级日志的显示 效果图: 实现原理: 主要区域分为两块,时间区和内容区,时间区是画一个圆点和显示一个时间,内容区左边一个竖线和文字显示 然后做一下循环,将每个日期的数据显示出来 布局采用f ...

  7. html防替换资源,Webpack中有没有替换html静态资源的插件

    比如html文件中有如下代码 <div> <!-- /dev 是开发目录 --> <img src="/dev/img.png"> </d ...

  8. spring mvc学习(43):处理静态资源

    上图·是目录结构,本节是有问同学的,当好好总结 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...

  9. WebJars统一管理静态资源

    推荐使用Webjars的三大理由:好用 使用教程------引入相关依赖: 首先在 WebJars官网  /WebJars - Web Libraries in Jars找到项目所需的依赖在pom引入 ...

  10. OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(上)

    这篇博文难产了很久,原来是打算一周更新一篇的,上周原计划写MVC,但是写了一半,发现带入了太多的细节,不太符合这个入门系列的主题. 当我们学习一个新的技能的时候,如果一开始就面对大量的细节,很容易陷入 ...

最新文章

  1. 如何将txt文档插入sql2000数据库
  2. Java异常机制及异常处理建议
  3. struts2框架下的一个简单的ajax例子
  4. 信号模型噪声服从零均值高斯分布_非高斯噪声下基于分数低阶循环谱的调制识别方法...
  5. 用 Python 爬虫框架 Scrapy 爬取心目中的女神
  6. python程序设计简明教程课后答案_Python简明教程最后的练习题
  7. Python实现箱形图的绘制
  8. 数学归纳法的5种常用形式——证明题的利器
  9. “word在试图打开文件时遇到错误”解决办法,亲测可用
  10. ESP8266-天猫精灵(智能家居)
  11. JavaScript——问卷星自动填写
  12. React.createElement()的使用
  13. Python Flask Web教程020: flask模板
  14. oracle业务关系sql,张瑞:Oracle与MySQL搭档满足业务需求
  15. ipad air4参数配置
  16. Ucinet三天写论文!北核科研网络精写
  17. Google拼音输入法的问题
  18. oracle执行存储过程 exec,Oracle如何执行存储过程 | 学步园
  19. html页面禁用开发者工具,禁用electron开发者工具中console警告信息
  20. EMBEDDING层作用

热门文章

  1. 一款云迁移产品的成长史
  2. Kafka从上手到实践 - Kafka集群:启动Kafka集群 | 凌云时刻
  3. Kafka从上手到实践 - Kafka集群:Kafka Listeners | 凌云时刻
  4. 智能制造的灾备问题如何解决? | 凌云时刻
  5. 新型肺炎数据,可以用Excel绘制成3维地图
  6. 【特征提取】基于matlab倒谱距离端点检测【含Matlab源码 1767期】
  7. 毕设题目:Matlab数字信号处理
  8. 【TSP】基于matlab混合粒子群算法求解旅行商问题【含Matlab源码 397期】
  9. c语言设计四路彩灯显示系统,数字电路逻辑设计课程设计-四路彩灯显示系统设计...
  10. 可解释ai_人工智能解释