学习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的套路相关推荐

  1. Webpack: Loader 开发分享

    Webpack: Loader 开发分享 文章目录 Webpack: Loader 开发分享 正文 1. Concept 概念 2. Configuration 配置实例 3. Custom 自定义 ...

  2. 一次搞懂Webpack Loader

    50 亿观众的 "云上奥运",顶级媒体背后的数智化力量 东京 2020 奥运会即将闭幕,本届奥运会由于疫情限制,东京地区赛事以无观众的空场形式举行,在无法亲临现场的情况下,全球观众 ...

  3. 如何编写一个 Webpack Loader

    前言 在平时自己由零搭建项目时,虽然基础配置都比较熟悉,比如配置 file-loader, url-loader, css-loader 等,配置不难,但究竟是怎么起作用的呢,今天就来说说如何编写一个 ...

  4. webpack 复习(四)webpack loader

    loader webpack 只是一个打包工具,它只负责分析各个模块的依赖关系,然后形成资源清单,最终打包生成到指定的文件中. 其他的功能需要借助 webpack loader 和 webpack p ...

  5. webpack loader解析及自定义loader

    自定义实现webpack loader加载模块,解析指定的类型文件 loader loader是一个导出为函数的node模块,可通过this访问上下文. 特点: loader单一职责,只负责解决单一的 ...

  6. webpack + loader 使用笔记

    先睹为快 demo 地址点 这里 1. 准备一个 webpack_demo 创建 src 和 dist 文件夹 在 src 目录下创建 js 文件夹 在 js 文件夹下创建 module-1.js,m ...

  7. webpack入门(四)——webpack loader 和plugin

    什么是loader loaders是你用在app源码上的转换元件.他们是用node.js运行的,把源文件作为参数,返回新的资源的函数.  例如,你可以用loaders告诉webpack加载 coffe ...

  8. 实现一个 webpack loader

    官网上的定义:loader 是一个转换器,用于对源代码进行转换. 例如 babel-loader 可以将 ES6 代码转换为 ES5 代码.sass-loader 将 sass 代码转换为 css 代 ...

  9. Webpack:Loader学习—— Pitching Loader

    Pitching 方法先执行(针对normal loader先 前到后执行Pitching  再后到前执行normal loader) {test: /\.js$/,//处理js文件// use: [ ...

最新文章

  1. 语义SLAM近5年主要技术进展及研究趋势
  2. 虚拟化--YESLAB DC Vphere5 上课PDF
  3. Python按行读取文件、写文件
  4. linux path环境变量检索目录,Linux下动态链接库加载路径及搜索路径问题
  5. Ribbon为什么要加入点对点直连的功能?如何操作?两句话玩转!
  6. 理解sqlalchemy与ORM
  7. LeetCode 317. 离建筑物最近的距离(逆向BFS)*
  8. mysql查看服务器版本sql_警告:您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解使用n的正确语法...
  9. GPS时钟同步系统在电力系统的重要性
  10. SpringCloud整合Feign配置类之间的关系以及feign配置隔离的实现
  11. ios怎么引入masonry_IOS之Masonry小结
  12. 抽象类应用模板方法模式和接口应用之策略设计模式
  13. matlab 遗传算法资料,matlab遗传算法代码
  14. SQL语句多表连接查询语法
  15. 推荐一个美中不失优雅的博客网主页(素材参考---麋鹿鲁哟)
  16. 【JAVA笔记】JAVA调用同一个包里的不同类的方法:
  17. python实现全网搜索_用Python实现一个大数据搜索引擎
  18. 【vue 进阶指南 一】多语言国际化(中英文切换)
  19. 使用you-get工具下载MP4视频
  20. Python: 向量、矩阵和多维数组(基于NumPy库)

热门文章

  1. GCC中同时使用动态和静态库链接的编译
  2. 文本特征选择 java代码_文本分类入门(十)特征选择算法之开方检验
  3. 20190404 Oracle忘记登陆密码
  4. Java8 stream filter map
  5. aspose.words for java操作文档doc,设置一级二级三级标题以及段落表格等详情
  6. bzoj2806: [Ctsc2012]Cheat
  7. Android Studio 提示Error running app: No Android facet found for app
  8. Eclipse,myeclipse开发中常用技巧总结
  9. 深入浅出理解Javascript原型概念以及继承机制(转)
  10. Linux下的各种文件阅读器