webpack构建之loader与plugin的区别是什么

在webpack中,loader和plugin是俩个关键的部分,常常被面试官拿来比较他们,那么他们到底有什么区别呢?

loader

loader是文件加载器,能够加载资源文件,并对这些文件进行统一处理,诸如编译、压缩等,最终一起打包到指定的文件中。处理一个文件可以使用多个loader,loader的执行顺序和配置中的顺序正好相反,也就是说最后一个loader最先执行,第一个loader最后执行。第一个执行的loader的返回值接收源文件内容作为参数,其他loader接收前一个执行的loader的返回值作为参数,最后执行的loader会返回此模块的JavaScript的源码。

编写自己的loader的时候需要引用官方提供的loader-utils,调用loaderUtils.getOptions(this)来拿到webpack的配置参数,然后进行自己的处理。loader本身只是一个函数。接收模块代码的内容然后发返回代码内容转化后的结果。并且一个文件还可以链式的经过多个loader的转化,比如:less-loader-->css-loader-->style-loader.一个loader的职责是单一的。只需要完成一种转化,如果一个源文件需要多步转化才能正常使用,就通过多个loader转化,在调用多个loader去转化一个文件的时候,每个loader会链式的去顺序执行。每一个loader将会拿到需要处理的原内容。上一个laoder处理的结果将会传给下一个loader接着处理,最后的loader将处理的最终结果返回给webpack。

简单的loader例子:

module.exports = function(source) {
    //    do something
    return source
}

 

常用的loader有哪些? 

file-loader: 文件加载;

url-loader:文件加载,在文件大小(单位 byte)低于指定的限制时,可以返回一个 DataURL;

image-loader:加载并压缩图片

json-loader:处理json,webpack已经默认包含

babel-loader:ES6+ 转化成ES5

ts-loader:将ts转化成js

postcss-loader:扩展css语法。使用postcss各种插件autoprefixer,cssnext,cssnano

eslint-loader:检查代码

vue-loader:加载vue单文件组件

i18n-loader:国际化

cache-loader:性能开销大的loader前添加,将结果缓存到磁盘

expose-loader:暴露对象为全局对象

import-loader,exports-loader等可以向模块诸如变量或者提供导出模块功能

plugin

plugin的功能更加强大,loader不能做的,plugin都能做。plugin的功能要更加丰富,从打包 优化和压缩,到从新定义环境变量。功能强大到可以用来处理各种各样的任务。

plugin让webpack的机制更加灵活,他的编译过程中留下的一系列生命周期钩子,通过调用这些钩子来实现在不同编译结果时对源模块进行处理。他的编译是基于事件流来编译的,主要通过taptable来实现插件的绑定和执行的,taptable主要就是基于发布订阅的插件架构,是用来创建生命周期钩子的库,通过调用complier.hooks.run.tap开始注册创建complilation,基于创建chunks,通过parser解析chunks,使用模块和依赖管理模块之间的依赖关系。最后使用template基于compilation数据生成结果代码。

plugin的实现可以是一个类,使用的时候传入相关配置来创建一个实例,然后放到配置的plugins字段中,而plugin实例中最重要的方法就是apply,该方法在webpack complier安装插件的时候会被调用一次。apply接收webpack complier对象实例的引用。你可以在complier对象实例上注册各种事件钩子函数。来影响webpack的所有构建流程。以便于完成更多的其他构建任务。

简单的plugin例子:

class BasicPlugin {
    constructor (options) {}
    apply(complier) {
        complier.plugin('compilation', function(compilation) {
            //    do something
        })
    }
}

module.exports = BasicPlugin

常用的plugin有哪些?

ignore-plugin:忽略文件

uglifyjs-webpack-plugin:不支持es6压缩

terser-webpack-plugin:支持es6压缩

webpack-parallel-uglify-plugin:多进程执行代码压缩,提升构建速度

serviceworker-webpack-plugin:为网页应用增加离线缓存功能

commonsChunkPlugin:提高打包效率,将第三方库和业务代码分开打包

html-webpack-plugin:可以根据模版自动生成html代码,并自动引用css和js文件

HotModuleRelpacementPlugin:热更新

这就是loader和plugin的区别。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值