通过以下几个实例掌握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. 图文讲解Android ImageView的ScaleType

    ScaleType的设置方式包括: 1. 在layout的xml中定义android:scaleType="xxx": 2. 在java代码中调用imageView.setScal ...

  2. kafka高吞吐量的分布式发布订阅的消息队列系统

    一:kafka介绍kafka(官网地址:http://kafka.apache.org)是一种高吞吐量的分布式发布订阅的消息队列系统,具有高性能和高吞吐率. 1.1 术语介绍BrokerKafka集群 ...

  3. ThinkPHP3验证码、文件上传、缩略图、分页(自定义工具类、session和cookie)

    验证码 TP框架中自带了验证码类 位置:Think/verify.class.php 在LoginController控制器中创建生存验证码的方法 login.html登陆模板中 在LoginCont ...

  4. Angular 修改路由策略,改为使用hash路由,即带#号URL

    修改app.module.ts如下  

  5. SQL Server 中的窗口函数(2012 新函数)

    简介 SQL Server 2012之后对窗口函数进行了极大的加强,但对于很多开发人员来说,对窗口函数却不甚了解,导致了这样强大的功能被浪费,因此本篇文章主要谈一谈SQL Server中窗口函数的概念 ...

  6. java AES-256加解密解决方法

    看文件操作即可: 链接:https://pan.baidu.com/s/1dQ_-cZitxbG31JVmRi-trg 提取码:89p4 复制这段内容后打开百度网盘手机App,操作更方便哦

  7. SQL IN 子查询返回多对值

    我们常用的IN 操作是这样的: select * from tab twhere t.col1 in ('value1''value2');12但是如果是多个列的取值来自同一个子查询呢? 我们是不是要 ...

  8. pytest_02-用例运行规则

    用例设计原则 文件名以test_*.py文件和*_test.py 以test_开头的函数 以Test开头的类 以test_开头的方法 所有的包pakege必须要有__init__.py文件 help帮 ...

  9. emmet html缩写

    HTML缩写 Emmet使用类似于CSS选择器的语法来描述元素在生成的树中的位置和元素的属性. 元素 您可以使用元素的名字,如div或p以生成 HTML标签. Emmet没有一组预定义的可用标签名称, ...

  10. centos7 挂载未分配的硬盘空间

    =============================================== 2019/7/28_第1次修改                       ccb_warlock == ...