Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第 148 题: webpack 中 loader 和 plugin 的区别是什么 #308

Open
yygmind opened this issue Nov 1, 2019 · 12 comments
Open

第 148 题: webpack 中 loader 和 plugin 的区别是什么 #308

yygmind opened this issue Nov 1, 2019 · 12 comments

Comments

@yygmind
Copy link
Contributor

yygmind commented Nov 1, 2019

No description provided.

@yygmind yygmind added the 平安 label Nov 1, 2019
@sf-cake
Copy link

sf-cake commented Nov 1, 2019

这里引用官方文档原文:

While loaders are used to transform certain types of modules, plugins can be leveraged to perform a wider range of tasks like bundle optimization, asset management and injection of environment variables.

相对于loader转换指定类型的模块功能,plugins能够被用于执行更广泛的任务比如打包优化、文件管理、环境注入等……

@Loading-m
Copy link

loader一般是将某个语法统一处理为统一的语法
plugin一般是在打包前或打包后对结果进行再次操作

@pyb123
Copy link

pyb123 commented Nov 1, 2019

loader,它是一个转换器,将A文件进行编译成B文件,比如:将A.less转换为A.css,单纯的文件转换过程。

plugin是一个扩展器,它丰富了webpack本身,针对是loader结束后,webpack打包的整个过程,它并不直接操作文件,而是基于事件机制工作,会监听webpack打包过程中的某些节点,执行广泛的任务

@wind4gis
Copy link

wind4gis commented Nov 1, 2019

loader:webpack自身只支持js和json这两种格式的文件,对于其他文件需要通过loader将其转换为commonJS规范的文件后,webpack才能解析到
plugin:是用于在webpack打包编译过程里,在对应的事件节点里执行自定义操作,比如资源管理、bundle文件优化等操作

@yangyl568
Copy link

loader:让webpack能够处理非js文件(自身职能理解js),然后你就可以利用 webpack 的打包能力,对它们进行处理。
例如:css-loader、style-loader、postcss-loader、sass-loader

plugins:从打包优化和压缩,一直到重新定义环境中的变量.
例如:uglify-webpack-plugin、clean-webpack-plugin、babel-polyfill

@brady0316
Copy link

通俗点讲loader是转换,plugin是执行比转换更复杂的任务,比如合并压缩等

@Ritr
Copy link

Ritr commented Nov 14, 2019

loader是翻译官,plugin是干活滴

@irina9215
Copy link

webpack 是由nodejs编写的前端资源加载/打包工具,由nodejs提供了强大的文件处理,IO能力。
loader: 是一个nodejs 函数模块, 传入resource file 或者sourceMap json 结果,读取文件,将文件处理为String 或者 Buffer 格式,然后传给compiler 或者下一个loader.
plugin: 是能够参与到compilation process的自定义函数,通过hook到每一个编译(compiler)中,触发关键事件或处理。

如何自定义webpack插件:

  • JavaScript 命名函数
  • 在插件函数prototype 上定义一个apply 方法
  • 定义一个绑定到webpack 自身的hook
  • 处理webpack内部特定数据
  • 功能完成后调用webpack 提供的回调

@tywei90
Copy link

tywei90 commented Feb 7, 2020

一、webpack的打包原理

  1. 识别入口文件
  2. 通过逐层识别模块依赖(Commonjs、amd或者es6的import,webpack都会对其进行分析,来获取代码的依赖)
  3. webpack做的就是分析代码,转换代码,编译代码,输出代码
  4. 最终形成打包后的代码

二、什么是loader

loader是文件加载器,能够加载资源文件,并对这些文件进行一些处理,诸如编译、压缩等,最终一起打包到指定的文件中

  1. 处理一个文件可以使用多个loader,loader的执行顺序和配置中的顺序是相反的,即最后一个loader最先执行,第一个loader最后执行

  2. 第一个执行的loader接收源文件内容作为参数,其它loader接收前一个执行的loader的返回值作为参数,最后执行的loader会返回此模块的JavaScript源码

三、什么是plugin

在webpack运行的生命周期中会广播出许多事件,plugin可以监听这些事件,在合适的时机通过webpack提供的API改变输出结果。

四、loader和plugin的区别

对于loader,它是一个转换器,将A文件进行编译形成B文件,这里操作的是文件,比如将A.scss转换为A.css,单纯的文件转换过程

plugin是一个扩展器,它丰富了webpack本身,针对是loader结束后,webpack打包的整个过程,它并不直接操作文件,而是基于事件机制工作,会监听webpack打包过程中的某些节点,执行广泛的任务

@sohoorc
Copy link

sohoorc commented Feb 19, 2020

个人理解:
1.loader针对的是项目最终输出的代码文件或资源文件。例如:通过less-loader、babel-loader等,它们都是将我们项目源码中的一些浏览器不支持代码转换成浏览器能够支持的代码。

  1. plugins针对的是工程层面,或是整个项目层面。它往往和源码无关,用来扩展工程、或者优化工程。

loader针对代码或资源,plugins针对工程。

@whatwg6
Copy link

whatwg6 commented Mar 16, 2020

Loaders:

Loaders work at the individual file level during or before the bundle is generated.

Plugins:

Plugins work at bundle or chunk level and usually work at the end of the bundle generation process. Plugins can also modify how the bundles themselves are created. Plugins have more powerful control than loaders.

Just for an example you can clearly see in below image where loaders are working and where plugins are working -

image

Reference

@kukuxi
Copy link

kukuxi commented Apr 11, 2020

loader支持除js、json以外的文件,并且将他们转换成有效的模块,加入到依赖图中。本质是一个函数,接受的文件为参数,返回转换结果。执行顺序是从右到左。

plugin用于优化bundle文件的优化,资源增强和变量注入。loader不能做的都由它来实现,以此增强webpack的功能。plugin作用于整个过程

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests