ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

webpack4.0各个击破(6)—— Loader篇

2019-11-15 13:00:15  阅读:299  来源: 互联网

标签:tpl 各个击破 编译器 loader dash webpack webpack4.0 line Loader


【摘要】 webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高。本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习webpack工具中相应的处理办法。(本篇中的参数配置及使用方式均基于webpack4.0版本)

pic0.png

一. loader综述

loaderwebpack的核心概念之一,它的基本工作流是将一个文件以字符串的形式读入,对其进行语法分析及转换(或者直接在loader中引入现成的编译工具,例如sass-loader中就引入了node-sass将SCSS代码转换为CSS代码,再交由css-loader处理),然后交由下一环节进行处理,所有载入的模块最终都会经过moduleFactory处理,转成javascript可以识别和运行的代码,从而完成模块的集成。

loader支持链式调用,所以开发上需要严格遵循“单一职责”原则,即每个loader只负责自己需要负责的事情:将输入信息进行处理,并输出为下一个loader可识别的格式。

实际开发中,很少会出现需要自己写loader来实现复杂需求的场景,如果某个扩展名的文件无法快速集成到自动化构建工具里,估计很快就会被抛弃了,大家都那么忙是吧。但是了解loader的基本原理和编译器的基本原理却是非常有必要的。

二. 如何写一个loader

如果需要编写一个功能完整的loader,建议先到webpack的官方网站浏览一下loader有哪些API,地址:webpack官网-loader API,其中对于编写同步loader异步loader如何跳过loader如何获取options配置项等等都做了非常详细的解释,本篇中不再赘述。

假设现在要实现一个dash-loader,它的功能是加载并处理名称为*.tpl.html的文件,将其变为一个CommonJs模块。也就是说要完成一个如下的基本转换:

转换前的文本:

1 <div>
2     <h3>这里是标题</h3>
3     <p>这里是内容</p>    </div>

转换后的文本:

var str = '<div><h3>这里是标题</h3><p>这里是内容</p></div>';module.exports = str;

那么webpack.config.js中需要增加如下的配置:

1 ...
2 module:{    rules:[{        test: /\.tpl\.html$/,        use:[{            loader:'dash-loader'
3         }]
4     }]
5 }

在项目的node_modules依赖文件夹中新建dash-loader文件夹,并在其中新建一个index.js文件,内容的基本格式为:

1 //index.jsmodule.exports = function(source){    var tpl="";
2     source.split(/\r?\n/).forEach(function(line){
3         line=line.trim();        if(!line.length){            return;
4         }        //对line进行处理...
5         tpl+=line;
6     });    return "var tpl=\'" + tpl + "\'\nmodule.exports = tpl"; 
7 }

最终由dash-loader返回的数据就好像是从某个CommonJs模块中读入的一样了。

三. loader的编译器本质

了解了loader的基本结构,那么loader里到底应该写点什么才能完成代码转换呢?这就涉及到了一个新的概念——编译器(Compiler)。一个基本的编译器,需要经过tokenize,parse,transform,stringify几个核心步骤,它的应用是非常广的,SPA中的virtual-DOM的解析,babel中的ES6语法解析等等,babel的官网曾经推荐过一个非常棒的开源项目(10k+Star),详细讲述了如何一步一步实现一个编译器的,建议感兴趣的同学可以自行学习:

【参考】

《如何编写一个loader》

来源:华为云社区 作者:大史不说话

标签:tpl,各个击破,编译器,loader,dash,webpack,webpack4.0,line,Loader
来源: https://www.cnblogs.com/huaweicloud/p/11865668.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有