案例实战之如何写一个webpack loader
通过以下几个实例掌握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的更多相关文章
- 案例实战之如何写一个webpack plugin
		案例实战之如何写一个webpack plugin 1.写一个生成打包文件目录的file.md文件 // 生成一个目录项目目录的文件夹 class FileListPlugin { constructo ... 
- 怎样写一个webpack loader
		div{display:table-cell;vertical-align:middle}#crayon-theme-info .content *{float:left}#crayon-theme- ... 
- 手把手教你撸一个 Webpack Loader
		文:小 boy(沪江网校Web前端工程师) 本文原创,转载请注明作者及出处 经常逛 webpack 官网的同学应该会很眼熟上面的图.正如它宣传的一样,webpack 能把左侧各种类型的文件(webpa ... 
- 手写一个webpack,看看AST怎么用
		本文开始我会围绕webpack和babel写一系列的工程化文章,这两个工具我虽然天天用,但是对他们的原理理解的其实不是很深入,写这些文章的过程其实也是我深入学习的过程.由于webpack和babel的 ... 
- 80行代码教你写一个Webpack插件并发布到npm
		1. 前言 最近在学习 Webpack 相关的原理,以前只知道 Webpack 的配置方法,但并不知道其内部流程,经过一轮的学习,感觉获益良多,为了巩固学习的内容,我决定尝试自己动手写一个插件. 这个 ... 
- Node.JS实战36:写一个WAF中间件!防黑客,防攻击
		如果用Node.JS做Web服务,很多时候是会选择Express的. 本文,将展示如何如何实现一个WAF中间件. WAF有什么用? WAF即Web Application Firewall,Web应用 ... 
- 发布一个npm包(webpack loader)
		发布一个npm包,webpack loader: reverse-color-loader,实现颜色反转. 初始化项目 mkdir reverse-color-loader cd ./reverse- ... 
- 如何开发webpack loader
		关于webpack 作为近段时间风头正盛的打包工具,webpack基本占领了前端圈.相信你都不好意思说不知道webpack. 有兴趣的同学可以参考下我很早之前的webpack简介 . 确实webpac ... 
- 图解CSS3核心技术与案例实战(1)
		前言: 我买了一本<图解CSS3核心技术与案例实战>大漠写的,为了提高自己的自觉性呢,抓紧看书,把读书笔记放在这上面,跟大家一起分享,也为督促自己完成读书计划. 文末有微信公众号,感谢你的 ... 
随机推荐
- Kubernetes平台环境搭建
			软件 版本 Linux操作系统 CentOS7.4 Kubernetes 1.12 Docker 18.xx-ce Etcd 3.x Flannel 0.10 角色 IP 组件 推荐配置 master ... 
- [Mobi] cordova requirements,Exception in thread "main" java.lang.NoClassDefFoundError
			Cordova App Preparation https://quasar.dev/quasar-cli/developing-cordova-apps/preparation $ cordova ... 
- golang遍历文件夹
			golang遍历文件夹: func main() { //方式一 filepath.Walk("temp/", func (path string, info os.FileInf ... 
- Android Studio使用adb命令连接平板
			有需要使用adb命令连接调试平板的同学可以参考下(下面是android官方文档,有点老). http://donandroid.com/how-to-install-adb-interface-dri ... 
- python中空列表判断方法总结,欢迎补充
			--代码-- if __name__ == '__main__': l = [] print(l.__len__() == 0) print(l.__sizeof__() == 40) print(l ... 
- LeetCode 912. 排序数组(Sort an Array) 43
			912. 排序数组 912. Sort an Array 题目描述 每日一算法2019/6/15Day 43LeetCode912. Sort an Array 
- [转帖]nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件
			nginx学习,看这一篇就够了:下载.安装.使用:正向代理.反向代理.负载均衡.常用命令和配置文件 2019-10-09 15:53:47 冯insist 阅读数 7285 文章标签: nginx学习 ... 
- Codeforces Round #604
			Beautiful Regional Contest 题意 题解 代码 Beautiful Sequence 题意 题解 代码 一个思路不够清晰的代码 Beautiful Mirrors with q ... 
- matplotlib 中文乱码问题
			matplotlib是Python著名的绘图库,默认并不支持中文显示,因此在不经过修改的情况下,无法正确显示中文. 本文将介绍解决这一问题的方法. 不修改文件,加两行代码即可: matplotlib. ... 
- Drools 规则文件语法概述
			概述(Overview) 以.drl为扩展名的文件,是Drools中的规则文件,规则文件的编写,遵循Drools规则语法.下面详细介绍一下Drools规则文件语法.具体参考官方文档: https:// ... 
