明确loader的作用与本质
loader字面意思是装载器,在webpack中它的实际功能则更像是预处理器。Webpack本身只认识JavaScript,对于其他资源必须预先定义一个或多个loader对其进行转译,输出为webpack能够接收的形式再继续进行,因此loader做的实际上是与处理的工作。——《webpack实战:入门、进阶与调优》
所谓 loader 只是一个导出为函数的 JavaScript 模块。loader runner 会调用这个函数,然后把上一个 loader 产生的结果或者资源文件(resource file)传入进去。第一个 loader 的传入参数只有一个:资源文件(resource file)的内容。compiler 需要得到最后一个 loader 产生的处理结果。这个处理结果应该是 String 或者 Buffer(被转换为一个 string),代表了模块的 JavaScript 源码。另外还可以传递一个可选的 SourceMap 结果(格式为 JSON 对象)。 ——loader API
官方指导:https://www.webpackjs.com/contribute/writing-a-loader/
辅助工具包
loader-utils和schema-utils
loader-utils和schema-utils是帮助编写loader的两个工具包。其中loader-utils中提供了很多关于路径和参数等的方法,schema-utils主要帮助校验传入loader中的选项参数。具体用法可以参看两个工具的npm文档。
一般安装完webpack就会默认安装loader-utils和schema-utils,如果没有,可以手动使用npm install来安装。
然而在操作时出现意外,我重新在命令行输入了npm install loader-utils。这导致我在写loader的index.js时无法使用loader-utils的getOptions(),我查看此时node_modules里的loader-utils,目录如下:
并没有getOptions,这和从webpack中文文档《编写一个loader》那一章链接出去的loader-utils项目仓库里目录是一致的。但官方的教程里却要求使用import {getOptions} from 'loader-utils'。
????
我在其他项目里试着引入,可以正常引入,尽管在node_modules里不能看见loader-utils.
诡异!
