当前位置:网站首页>一起来自定义loader吧
一起来自定义loader吧
2022-07-20 09:59:00 【一颗冰淇淋】
loader 在 webpack 编译中起到非常重要的作用,用于对模块的源代码进行转换,比如 css-loader 将 css 代码处理成字符串,style-loader 创建 style 标签将 css 代码添加到 html 页面中。
自定义 loader
新建 node 项目,在 src 文件夹下的 index.js 中简单编写一些代码
const user = {
name: 'alice',
age: 20,
};
创建 loaders 文件夹,在文件夹下增加用于处理 loader 的 js 文件,通过 module.exports 函数可以拿到需处理的文件内容,并将处理好的结果返回
module.exports = function (content) {
console.log('ice-loader>>', content);
return content + '"@author icecream"';
};
在配置文件 webpack.config.js
中引入自定义的 loader 。定义 loader 方式有两种
- 通过相对路径引入(这里使用的方式)
- 通过 resolveLoader 属性配置,默认会去 node_modules 中查询依赖
// 其他配置省略
module: {
rules: [
{
test: /\.js/i,
use: ['./loaders/ice-loader'],
},
],
},
通过 webpack
编译文件,在控制台上输出了获取到的文件内容,编译后文件就是通过自定义 loader 返回的内容。
同步异步 loader
通过 loader 处理的数据需要返回 javscript 字符串,有两种方式
return
语句返回内容this.callback
函数返回内容
当遇到异步返回的情况时,直接使用以上两种方式是会报错的
需要通过 this.async
函数将处理过程变成异步,this.callback
第一个参数接收 error,如果没有错误则传递 null,其他参数与loader中 module.exports
获取的参数相同
babel-loader
babel-loader
处理 js 代码借助的是 babel
这个工具,我们也可以简易实现一个,取名为ice-babel-loader
,使用 babel
的时候需要通过 plugin
或者 presets
定义处理规则
{
test: /\.js/i,
use: [
{
loader: './loaders/ice-babel-loader',
options: {
presets: ['@babel/preset-env'],
},
},
],
},
babel
工具核心库是 @babel/core
,定义处理规则要用到预设 @babel/preset-env
,依次安装
const babel = require('@babel/core');
module.exports = function (content) {
const options = this.getOptions(); // 获取loader中定义的options
const callback = this.async();
babel.transform(content, options, (err, result) => {
if (err) callback(error);
callback(null, result.code);
});
};
这样我们定义的 ice-babel-loader
就将 es6
的语法转成了 es5
md-loader
Markdown
是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者HTML)文档。
那 md 文件是否可以通过 loader 转换成 html 文档呢?答案是肯定的,已经有一些好用的库给我们提供了这个功能。
marked
用于处理 markdown
格式的文件,highlight.js
用于给 markdown
文件中的代码设置样式
const {
marked } = require('marked');
const hljs = require('highlight.js');
module.exports = function (content) {
// 给markdown中的代码增加class属性
marked.setOptions({
highlight: function (code, lang) {
return hljs.highlight(lang, code).value;
},
});
const htmlContent = marked(content);
return htmlContent;
};
此时通过 md-loader
返回的是普通字符串,不能被 javascript
代码所识别,还需要通过 html-loader
处理。
{
test: /\.md/i,
use: ['html-loader', './loaders/md-loader'],
},
通过 loader
处理后的 md 文件导出的是 javascript 字符串,所以可以直接添加到 body 中查看效果,另外代码的样式显示需要引入 highlight.js
中的 css 文件
// index.js
import code from './doc.md';
import 'highlight.js/styles/default.css';
document.body.innerHTML = code;
这样 markdown 文件就可以在项目中被解析到 html 页面中了
总结
- 自定义 loader 通过 module.exports 获取获取资源内容,经过一系列处理并返回处理后的结果。
- 自己编写的 loader 在本地可以直建立文件夹处理资源,开发完成后发布到 npm 仓库可以直接通过下载包的方式引用 loader。
以上就是关于 自定义loader 的介绍, 更多有关 webpack
的内容可以参考我其它的博文,持续更新中~
边栏推荐
- Jenkins首次安装选择推荐插件时出现“: No such plugin: cloudbees-folder” 解决方案
- [020] [STM32] CAN总线通信协议分析与应用
- After working for two months in the summer vacation, I understood three routing schemes of keepalived high availability
- NepCTF
- 6G:典型应用、关键技术与面临挑战
- Win10账户初始化配置
- 安科瑞马达监控方案低压电动机回路及馈线配电回路电力能源监测
- Redis-Set类型
- 数商云:如何实现供应商SRM管理系统的应用价值?
- 论开源生态的经济模型
猜你喜欢
Consul 集群部署
Cookie和Session
[020] [STM32] CAN总线通信协议分析与应用
仍旧是同步问题
What is the role of GIS equipment in land and resources management?
Redis data structure & General Command
自定义持久层框架MyORMFramework(二)—框架设计
Change your posture to do operation and maintenance! GOPs 2022 Shenzhen station highlights first!
[hdlbits skimming] Verilog language -- basics
数商云精细化工行业管理平台一体化信息化解决方案
随机推荐
Query the space occupied by a table and the amount of data in the table
Redis-数据结构&&通用命令
Redux最佳实践「Redux Toolkit」
XSS(跨站脚本攻击)相关内容总结整理
Extract excel header
Stm32+dht11 reading temperature and humidity data display
Role of subnet mask
Redis hash type
Redis command line client
查询某个表占用的空间大小以及表的数据量
基于二维声子晶体的体声波谐振器仿真分析
剑指 Offer 11. 旋转数组的最小数字
pycharm 写 sqlite 语句没有代码提示
Unity learning notes conversion between plane pixel coordinates of spherical panorama and coordinates on three-dimensional coordinate system
基于主动学习和Wi-Fi感知的人体识别系统
qt 实现日历美化
一个短信验证码功能引发的总结思考[通俗易懂]
运算表达式的抽象
[postgraduate entrance examination vocabulary training camp] day 9 - vital, dynamity, previous, pray, transit, virile, invent
npm 和yarn的常用指令