通过以下几个实例掌握webpack loader的写法

1.写一个多语言替换的loader

在index.js在页面上插入了一个{{title}}文本,我们需要在打包的时候将其替换成对应的多语言

function component() {
let element = document.createElement('div')
let str = 'hello webpack loader <h1>{{title}}</h1>'
element.innerHTML = str
element.classList.add('hello')
document.body.appendChild(element)
}
component()

loader的写法

const loaderUtils = require('loader-utils')
const langEnv = process.env.langEnv || 'English'
const languageLoader = function (source) {
let options = loaderUtils.getOptions(this) //获取配置传递过来的参数
let sources
if (langEnv.trim() == 'English') {
sources = source.replace('{{title}}', 'English title')
} else {
sources = source.replace('{{title}}', '中文标题')
}
return sources
}
module.exports = languageLoader

使用自己定义的loader

// 配置loader的别名
resolveLoader: {
modules: ['node_modules', './loaders'],
alias: {
"language-loader": utils.resolve('./loaders/languageLoader.js'),
}
},
module:{
rules:[
{
test:/\.js?$/,
use: [
{ loader: 'babel-loader' },
{
loader: 'language-loader',
options: {
name: '多语言转换的loader'
}
}
]
}
]
}

设置环境变量

 "dev": "set langEnv=English && webpack --config ./webpack.dev.config.js",

执行npm run dev

2.写一个转换less的loader

const less = require('less')
function loader(source) {
let css = ''
less.render(source, (err, c) => {
if (err) {
console.log(err)
return
}
css = c.css
})
return css
}
module.exports = loader

3.写一个style-loader

const loaderUtils = require('loader-utils')
function loader(source) {
console.log('style-loader', this.resourcePath, source)
let sourcec = source
let style = `
let style = document.createElement('style');
style.innerHTML = ${JSON.stringify(sourcec)}
document.head.appendChild(style)`
return style
}

4.写一个file-loader

// 这是一个文件打包loader
const loaderUtils = require('loader-utils')
function loader(source) {
let filename = loaderUtils.interpolateName(this, '[hash].[ext]', {
content: source
})
this.emitFile(filename, source)
return `module.exports="${filename}"`
}
loader.raw = true //转换为二进制
module.exports = loader

5.写一个url-loader

// url-loader
const loaderUtils = require('loader-utils')
const mime = require('mime')
function loader(source) {
let { limit } = loaderUtils.getOptions(this)
console.log(this.resoucePath) //获取资源的路径
let fileType = mime.getType(this.resoucePath)
if (limit && limit > source.length) {
return `module.exports="data:${fileType};base64,${source.toString('base64')}"`
} else {
return require('./file-loader.js').call(this, source)
}
}
loader.raw = true
module.exports = loader

6.写一个打包不同皮肤的css loader

我需要在打包的时候传入一个配置参数,就可以调取到不同的less颜色变量,从而渲染成不同风格的css文件

const loaderUtils = require('loader-utils');
const STYLE_TAG_REG = /(\<style.*?lang="less?".*?\>)([\S\s]*?)(\<\/style\>)/g;
//多站点皮肤切换
let themeName = process.argv[2] || 'blackTheme';
let injectUrl = "@import '~@/assets/theme/"+themeName+"/diffColor.less';";
let injectedTemplate = injectUrl;
module.exports = function (source) {
let options = loaderUtils.getOptions(this);
if (options && options.injectInVueFile) {
// 向每一个.vue文件的<style>块中注入
return source.replace(STYLE_TAG_REG, `$1${injectedTemplate}$2$3`);
}
return injectedTemplate + source;
};

是不是写一个loader是一件很简单的事情呢,十几行代码就搞定了啦

案例实战之如何写一个webpack loader的更多相关文章

  1. 案例实战之如何写一个webpack plugin

    案例实战之如何写一个webpack plugin 1.写一个生成打包文件目录的file.md文件 // 生成一个目录项目目录的文件夹 class FileListPlugin { constructo ...

  2. 怎样写一个webpack loader

    div{display:table-cell;vertical-align:middle}#crayon-theme-info .content *{float:left}#crayon-theme- ...

  3. 手把手教你撸一个 Webpack Loader

    文:小 boy(沪江网校Web前端工程师) 本文原创,转载请注明作者及出处 经常逛 webpack 官网的同学应该会很眼熟上面的图.正如它宣传的一样,webpack 能把左侧各种类型的文件(webpa ...

  4. 手写一个webpack,看看AST怎么用

    本文开始我会围绕webpack和babel写一系列的工程化文章,这两个工具我虽然天天用,但是对他们的原理理解的其实不是很深入,写这些文章的过程其实也是我深入学习的过程.由于webpack和babel的 ...

  5. 80行代码教你写一个Webpack插件并发布到npm

    1. 前言 最近在学习 Webpack 相关的原理,以前只知道 Webpack 的配置方法,但并不知道其内部流程,经过一轮的学习,感觉获益良多,为了巩固学习的内容,我决定尝试自己动手写一个插件. 这个 ...

  6. Node.JS实战36:写一个WAF中间件!防黑客,防攻击

    如果用Node.JS做Web服务,很多时候是会选择Express的. 本文,将展示如何如何实现一个WAF中间件. WAF有什么用? WAF即Web Application Firewall,Web应用 ...

  7. 发布一个npm包(webpack loader)

    发布一个npm包,webpack loader: reverse-color-loader,实现颜色反转. 初始化项目 mkdir reverse-color-loader cd ./reverse- ...

  8. 如何开发webpack loader

    关于webpack 作为近段时间风头正盛的打包工具,webpack基本占领了前端圈.相信你都不好意思说不知道webpack. 有兴趣的同学可以参考下我很早之前的webpack简介 . 确实webpac ...

  9. 图解CSS3核心技术与案例实战(1)

    前言: 我买了一本<图解CSS3核心技术与案例实战>大漠写的,为了提高自己的自觉性呢,抓紧看书,把读书笔记放在这上面,跟大家一起分享,也为督促自己完成读书计划. 文末有微信公众号,感谢你的 ...

随机推荐

  1. BlackBerry Key2 键盘扩展

    概述 BlackBerry Key2 键盘扩展是为BlackBerry Key2输入物理键盘上缺少的键而制作的输入法. BlackBerry Key2键盘和内置输入法是为商业环境而设计的,缺少桌面计算 ...

  2. 最新 多点Dmalljava校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.多点Dmall等10家互联网公司的校招Offer,因为某些自身原因最终选择了多点Dmall.6.7月主要是做系统复习.项目复 ...

  3. Java数组操作类

    最近又重新在看慕课网的数据结构,然后把示例代码整理一下. public class Array<E> { private E[] data; private int count = 0; ...

  4. MQTT的Res接口发布消息

    MQTT(这里采用的V2版本)发布消息的常见方法: 1.通过MQTT客户端连接MQTT服务器,建立长连接,通过接口发布消息 最常见的客户端: <dependency> <groupI ...

  5. Highcharts 宽度溢出容器

    1,设置Highcharts的动态宽高. 获取Highcharts图表需要的宽高值,给到Highcharts图表的div容器. 如:var hpvCountSendDateHei = $(" ...

  6. [转帖]NSO到底是个什么样的公司?揭秘三叉戟0day的缔造者

    NSO到底是个什么样的公司?揭秘三叉戟0day的缔造者 dawner2016-09-07共248912人围观 ,发现 3 个不明物体其他安全报告 https://www.freebuf.com/art ...

  7. Mysql 语句 insert into 与 replace into 区别

    []insert into 与 replace into 区别 replace into 的运行与insert into 很相似.不同点: 若表中的一个旧记录与一个用于PRIMARY KEY 或 一个 ...

  8. datanode启动异常(Incompatible clusterIDs)

    问题: 正常start-all.sh无法启动datanode进程,但是./hadoop-daemon.sh start datanode又可以启动.过一会后datanode进程又莫名消失. 原理: 多 ...

  9. 【LEETCODE】60、数组分类,适中级别,题目:75、560、105

    package y2019.Algorithm.array.medium; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.a ...

  10. VB.NET 读写XML

    Public Class CSysXML Dim mXmlDoc As New System.Xml.XmlDocument Public XmlFile As String Public Sub N ...