案例实战之如何写一个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 '[email protected]/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是一件很简单的事情呢,十几行代码就搞定了啦

原文地址:https://www.cnblogs.com/xinggood/p/11996928.html

时间: 2024-10-07 18:54:13

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

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

1.写一个生成打包文件目录的file.md文件 // 生成一个目录项目目录的文件夹 class FileListPlugin { constructor(options) { this.options = options } apply(compiler) { compiler.hooks.emit.tap('fileListPlugin', (compilation) => { let assets = compilation.assets let content = 'In this bui

怎样写一个webpack loader

在上一篇<webpack从入门到上线>介绍了wepack的配置和相关的概念,这一篇介绍怎样写一个webpack loader. 通过写一个js的html模板为例子. 上篇文章已提及,loader加载器就是对各种非正常资源的解析,转化成浏览器可以识别的js/css文件等,甚至可以说loader就是一个小型的编译器.例如sass loader:将sass格式编译成css,在安装sass的过程中你会发现,其实sass用的是C++,sass本身是面向对象的.但是本文不会介绍怎样写一个编译器(我也不知道

Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

#29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类Truck是Car类的子类,其中包含的属性有载重量payload.每个 类都有构造方法和输出相关数据的方法.最后,写一个测试类来测试这些类的功 能. package hanqi; public class Vehicle { private int wheels; private int weight

编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(四)结语

四则运算编译器,虽然说功能很简单,只能编译四则运算表达式.但是编译原理前端部分几乎都有涉及,词法分析,语法分析,还有代码生成. 再复杂的编译器.再简单的编译器,功能上是差不多的,只是复杂的编译器实现上会更困难. 这个系列的文章是为了帮助你入门,在这个基础上再去看编译原理相关书籍,不至于打瞌睡. 如果你对编译原理很有兴趣,并且想更深一步的学习,在这里强烈推荐你看一本书--我心目中的神书--<计算机系统要素-从零开始构建现代计算机>. 这本书神在哪? 神在它通俗易懂,对小白足够友好,但又不过分肤浅

Swift 写一个简单界面(实战-新手)

原文链接 在这篇博文中你可以看到那些内容呢, 首先这是一个用tableView纯代码Swift写的简单界面, 你可以看到下面这些 - 使用Alamofire 进行网络请求 - 使用MJExtension 进行字典转模型 - 使用HanekeSwift 进行图片的赋值 - 如何写一个模型(M) - 如何自定义一个UITableViewCell Alamofire 简单网络请求 func XTNetworkReq(url: String){ print("SUMMER_TEST_1") A

Cordova webapp实战开发:(6)如何写一个iOS下自动更新的插件?

上一篇我们学习了如何写一个Andorid下自动更新的插件,我想还有一部分看本系列blog的开发人员希望学习在iOS下如何做插件的吧,那么今天你就可以来看看这篇文字了. 本次练习你能学到的 学习如何获取iOS当前版本号 学习iOS下插件类的编写 学习iOS下插件的配置 学习iOS下插件的调用 主要内容 APP中[检查更新]显示当前版本号 插件类的编写 在上一篇介绍Andorid插件时我们贴出了很多源码,这里也直接贴出代码,首先是iOS下插件的代码. 我们在Plugins下新建两个文件,一个头文件

搭建一个webpack微服务器

[前言]:因为最近在vue2.0的时候用到了webpack的externals,才发现我之前都只是用webpack做一些搭建完项目后的"收尾工作"--即打包,而没有把它纳入到项目开发的"主体过程"中来,真是"物不尽其用".于是就有了我今天的这篇学习文章:利用webpack-dev-server搭建一个webpack的服务器 参考资料: webpack-dev-server的github地址:https://github.com/webpack/w

【webpack】webpack-dev-server生猛上手——让我们来搭一个webpack的微服务器吧!

[前言]:因为最近在搞百度地图API的时候用到了webpack的externals,才发现我之前都只是用webpack做一些搭建完项目后的"收尾工作"--即打包,而没有把它纳入到项目开发的"主体过程"中来,真是"物不尽其用".于是就有了我今天的这篇学习文章:利用webpack-dev-server搭建一个webpack的服务器 参考资料: webpack-dev-server的github地址:https://github.com/webpack

第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密

一:Spark集群开发环境准备 启动HDFS,如下图所示: 通过web端查看节点正常启动,如下图所示: 2.启动Spark集群,如下图所示: 通过web端查看集群启动正常,如下图所示: 3.启动start-history-server.sh,如下图所示: 二:HDFS的SparkStreaming案例实战(代码部分) package com.dt.spark.SparkApps.sparkstreaming; import org.apache.spark.SparkConf; import o