webpack loader的套路
学习webpack loader,最后模拟style-loader、less-loader
什么是loader
- loader是一个函数,用来把文件转换成webpack识别的模块。
loader API
- this.callback,一个可以同步或者异步调用的可以返回多个结果的函数。
- this.async,异步的loader,返回this.callback
如何编写loader
设置
- webpack默认从node_modules里找loader
- 直接引入loader
{test: /\.js$/use: [{loader: path.resolve('path/to/loader.js'),options: {/* ... */}}]
}
复制代码
- 如果有多个loader的目录,可以设置loader的目录,webpack会从设置的目录里找到loader
resolveLoader: {modules: ['node_modules',path.resolve(__dirname, 'loaders') //自己开发的loaders]
}
复制代码
简单用法
- 当使用一个loader时,这个loader函数只有一个参数,参数是包含文件内容的字符串。
- 同步loader可以返回一个代表模块转化后的简单的值
- loader的返回值是javascript代码字符串或者是Buffer
//css-loader 把css解析成webpack识别的模块
module.exports = function(source) {return `module.exports=${source}`;
}
复制代码
复杂用法
- 当配置多个loader时,loader的执行顺序时从右往左,右边的执行结果作为参数传到左边。
- less-loader把less转化成css,传给css-loader,css-loader把结果给style-loader,style-loader返回javascript代码字符串。
{test:/\.less$/,use:['style-loader','css-loader','less-loader']
}
复制代码
编写原则
- 单一职责。每个loader只负责一件事情。
- 使用链式调用,确保loader的依赖关系的正确。
- 无状态性,确保loader在不同模块转换之间不保存状态。每次运行都应该独立于其他编译模块以及相同模块之前的编译结果。
loader工具库
- loader-utils,可以获取loader的options
- schema-utils,校验loader的options的合法性
模拟less-loader、css-loader、style-loader
- less-loader负责把less编译成css
const less = require('less');
module.exports = function (source) {less.render(source, (e, output)=>{this.callback(e,output.css); //把编译后的css返回给下一个loader});
};复制代码
- css-loader负责把css交给下一个loader
module.exports = function (source) {return source; //source是上个loader的返回值,如果没有上一个loader,则是css的内容
};
复制代码
- style-loader把css添加到style标签里
module.exports = function (source) {return `const e = document.createElement('style');e.innerHTML = ${JSON.stringify(source)};document.head.appendChild(e);`;
};
复制代码
- 虽然每个loader功能简单,但是loader之前职责单一,方便扩展。
总结
webpack loader的功能远不止这些,本文算是编写loader的"套路"入门篇。
参考
- 源码
- 编写一个loader
- webpack-loader api
- loader-utils
- schema-utils
webpack loader的套路相关推荐
- Webpack: Loader 开发分享
Webpack: Loader 开发分享 文章目录 Webpack: Loader 开发分享 正文 1. Concept 概念 2. Configuration 配置实例 3. Custom 自定义 ...
- 一次搞懂Webpack Loader
50 亿观众的 "云上奥运",顶级媒体背后的数智化力量 东京 2020 奥运会即将闭幕,本届奥运会由于疫情限制,东京地区赛事以无观众的空场形式举行,在无法亲临现场的情况下,全球观众 ...
- 如何编写一个 Webpack Loader
前言 在平时自己由零搭建项目时,虽然基础配置都比较熟悉,比如配置 file-loader, url-loader, css-loader 等,配置不难,但究竟是怎么起作用的呢,今天就来说说如何编写一个 ...
- webpack 复习(四)webpack loader
loader webpack 只是一个打包工具,它只负责分析各个模块的依赖关系,然后形成资源清单,最终打包生成到指定的文件中. 其他的功能需要借助 webpack loader 和 webpack p ...
- webpack loader解析及自定义loader
自定义实现webpack loader加载模块,解析指定的类型文件 loader loader是一个导出为函数的node模块,可通过this访问上下文. 特点: loader单一职责,只负责解决单一的 ...
- webpack + loader 使用笔记
先睹为快 demo 地址点 这里 1. 准备一个 webpack_demo 创建 src 和 dist 文件夹 在 src 目录下创建 js 文件夹 在 js 文件夹下创建 module-1.js,m ...
- webpack入门(四)——webpack loader 和plugin
什么是loader loaders是你用在app源码上的转换元件.他们是用node.js运行的,把源文件作为参数,返回新的资源的函数. 例如,你可以用loaders告诉webpack加载 coffe ...
- 实现一个 webpack loader
官网上的定义:loader 是一个转换器,用于对源代码进行转换. 例如 babel-loader 可以将 ES6 代码转换为 ES5 代码.sass-loader 将 sass 代码转换为 css 代 ...
- Webpack:Loader学习—— Pitching Loader
Pitching 方法先执行(针对normal loader先 前到后执行Pitching 再后到前执行normal loader) {test: /\.js$/,//处理js文件// use: [ ...
最新文章
- 语义SLAM近5年主要技术进展及研究趋势
- 虚拟化--YESLAB DC Vphere5 上课PDF
- Python按行读取文件、写文件
- linux path环境变量检索目录,Linux下动态链接库加载路径及搜索路径问题
- Ribbon为什么要加入点对点直连的功能?如何操作?两句话玩转!
- 理解sqlalchemy与ORM
- LeetCode 317. 离建筑物最近的距离(逆向BFS)*
- mysql查看服务器版本sql_警告:您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解使用n的正确语法...
- GPS时钟同步系统在电力系统的重要性
- SpringCloud整合Feign配置类之间的关系以及feign配置隔离的实现
- ios怎么引入masonry_IOS之Masonry小结
- 抽象类应用模板方法模式和接口应用之策略设计模式
- matlab 遗传算法资料,matlab遗传算法代码
- SQL语句多表连接查询语法
- 推荐一个美中不失优雅的博客网主页(素材参考---麋鹿鲁哟)
- 【JAVA笔记】JAVA调用同一个包里的不同类的方法:
- python实现全网搜索_用Python实现一个大数据搜索引擎
- 【vue 进阶指南 一】多语言国际化(中英文切换)
- 使用you-get工具下载MP4视频
- Python: 向量、矩阵和多维数组(基于NumPy库)
热门文章
- GCC中同时使用动态和静态库链接的编译
- 文本特征选择 java代码_文本分类入门(十)特征选择算法之开方检验
- 20190404 Oracle忘记登陆密码
- Java8 stream filter map
- aspose.words for java操作文档doc,设置一级二级三级标题以及段落表格等详情
- bzoj2806: [Ctsc2012]Cheat
- Android Studio 提示Error running app: No Android facet found for app
- Eclipse,myeclipse开发中常用技巧总结
- 深入浅出理解Javascript原型概念以及继承机制(转)
- Linux下的各种文件阅读器