常用 loader 和 plugin 作用汇总简介

参考文档:
https://juejin.im/post/5a2123765188253ee45b3e8a
https://webpack.docschina.org/loaders/style-loader/
https://github.com/webpack-contrib/mini-css-extract-plugin
https://www.jianshu.com/p/91e60af11cc9
https://www.npmjs.com/package/node-notifier

css-loader:
css-loader 主要用于处理图片路径(包括导入 css 文件的路径),并且会将 css 样式打包进 js 文件中(以模块的形式打包导入)。

style-loader:
style-loader 通过 <style> 标签将 css 插入到 DOM 中。建议 style-loadercss-loader 结合使用。

postcss-loader:
postcss-loader 我们编写 css 时为了兼容不同浏览器会加上前缀比如 -webkit 等。postcss 会帮我们自动加上前缀,不用一个一个的手动添加。

sass-loader:
加载 sass/scss 文件并且变异成 css。

vue-loader:
Vue Loader 是一个 webpack 的 loader,它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件。

<template>
  <div class="example">{{ msg }}</div>
</template>

<script>
export default {
  data () {
    return {
      msg: 'Hello world!'
    }
  }
}
</script>

<style>
.example {
  color: red;
}
</style>

注意:
Vue Loader 的配置和其它的 loader 不太一样。除了通过一条规则将 vue-loader 应用到所有扩展名为 .vue 的文件上之外,请确保在你的 webpack 配置中添加 Vue Loader 的插件:

// webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')

module.exports = {
  module: {
    rules: [
      // ... 其它规则
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      }
    ]
  },
  plugins: [
    // 请确保引入这个插件!
    new VueLoaderPlugin()
  ]
}

这个插件是必须的! 它的职责是将你定义过的其它规则复制并应用到 .vue 文件里相应语言的块。例如,如果你有一条匹配 /\.js$/ 的规则,那么它会应用到 .vue 文件里的 <script> 块。
vue-loader 中文文档

vue-style-loader:
vue-style-loader 是基于 style-loader 的,与 style-loader 相似,你可以链式的加在 css-loader 后面,通过 <style> 标签动态的将 css 注入到 document 中。因为它会作为一个内置的依赖被vue-loader 使用,所以通常你不需要自己手动的配置它。
但是如果要支持 Vue SSR 的话,你最好使用 vue-style-loader。当我们以 node 为 target 打包,所有渲染的组件里的 样式会被收集起来并且以 context.styles 暴露给 Vue render context。这样你就可以简单的把样式插入到 <head> 标签中了。

mini-css-extract-plugin:
mini-css-extract-plugin 将 css 提取为独立的文件,对每个包含 css 的js文件都会
创建一个 css 文件。支持按需加载 css 和 sourceMap。暂不支持 HMR。
这个插件应该只用在 production 配置中,并且在 loaders 链中不适用 style-loader,特别是在开发中使用 HMR,因为这个插件暂不支持 HMR。

node-notifier:
node-notifier 是 node 模块,用 node.js 发送跨平台(包括 maxOS、Windows、Linux)的原生的通知。

  • macOS: >= 10.8 for native notifications, or Growl if earlier.
  • Linux: notify-osd or libnotify-bin installed (Ubuntu should have this by default)
  • Windows: >= 8, or task bar balloons for Windows < 8. Growl as fallback. Growl takes precedence over Windows balloons.
  • General Fallback: Growl

uglify-webpack-plugin:
压缩 javascript
https://www.npmjs.com/package/uglifyjs-webpack-plugin
https://blog.csdn.net/u013884068/article/details/83511343

optimize-css-assets-webpack-plugin
optimize-css-assets-webpack-plugin 用于优化压缩 css 资源。
它会在 webpack 构建时找到 css 资源,并且优化压缩。解决

https://www.npmjs.com/package/optimize-css-assets-webpack-plugin CSS

clean-webpack-plugin:
由于一些历史遗留代码会导致我们的 /dist 目录相当杂乱,webpack打包会生成文件,然后将这些文件放置在 /dist 文件中,但是 webpack 无法追踪到哪些文件实际在项目中用到的。
通常,在每次构建前清理 /dist 文件夹,是比较推荐的做法,因此只会生成用到的文件。clean-webpack-plugin 就很符合这种场景。通过配置,我们可以实现每次构建前清理 /dist 文件夹。当然,它作为一个普及的管理插件,还可以清除些别的,比如日志啥的。
https://www.kancloud.cn/xiaoyulive/webpack/531352

但是在配置时,我发现没起作用,github 上有位老兄解决了我的问题。
The plugin is working as intended. It's trying to delete the dist folder from the location of the config file (being webpack/common.js). Since you specified your output path to path.resolve(__dirname, '../dist'), you should change the root path accordingly (default: __dirname):

new CleanWebpackPlugin(['dist'], {
  root: path.join(__dirname, '..')
})

大致意思好像是它的路径是相对于配置文件的目录来配的。

eslint-loader:
让 webpack 支持 eslint。

eslint-friendly-formatter:
能够对 eslint 提示进行格式化(显示更为友好)并且生成报告。对于 subline text 和 iterm2 很友好,能够根据提示点开文件(具体是哪个文件报出提示)。但我觉得对 vs code 也挺友好的。

当我们使用 eslint 来校验我们的代码时,有一点不方便,就是错误报告对 终端支持不友好。我们不能通过编辑器直接点开报错文件,也不能直接定位到行。eslint-friendly-formatter 就解决了这个问题。

babel-polyfill:
babel 默认只转换新的 javascript 句法。而不转换新的 API,比如 Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise 等全局对象,以及一些定义在全局对象上的方法(比如 Object.assign)都不会转码。
举例来说,ES6在Array对象上新增了Array.from方法。Babel就不会转码这个方法。如果想让这个方法运行,必须使用babel-polyfill,为当前环境提供一个垫片。
https://blog.csdn.net/chjj0904/article/details/79169821

svg-sprite-loader:
创建 SVG 雪碧图。
https://segmentfault.com/a/1190000015367490
https://www.npmjs.com/package/svg-sprite-loader
file-loader:
如果我们希望在页面引入图片(包括img的src和background的url)。当我们基于webpack进行开发时,引入图片会遇到一些问题。

其中一个就是引用路径的问题。拿background样式用url引入背景图来说,我们都知道,webpack最终会将各个模块打包成一个文件,因此我们样式中的url路径是相对入口html页面的,而不是相对于原始css文件所在的路径的。这就会导致图片引入失败。这个问题是用file-loader解决的,file-loader可以解析项目中的url引入(不仅限于css),根据我们的配置,将图片拷贝到相应的路径,再根据我们的配置,修改打包后文件引用路径,使之指向正确的文件。

url-loader:
将 文件转换成 base64 URI。
要求 node >= v6.9.0 且 webpack >= v4.0.0。
url-loader 功能与 file-loader 相似,但是如果文件小于一个 指定的大小他可以返回一个 DataURL。
另外,如果图片较多,会发很多http请求,会降低页面性能。这个问题可以通过url-loader解决。url-loader会将引入的图片编码,生成dataURl。相当于把图片数据翻译成一串字符。再把这串字符打包到文件中,最终只需要引入这个文件就能访问图片了。当然,如果图片较大,编码会消耗性能。因此url-loader提供了一个limit参数,小于limit字节的文件会被转为DataURl,大于limit的还会使用file-loader进行copy。

url-loader和file-loader是什么关系呢?简答地说,url-loader封装了file-loader。url-loader不依赖于file-loader,即使用url-loader时,只需要安装url-loader即可,不需要安装file-loader,因为url-loader内置了file-loader。通过上面的介绍,我们可以看到,url-loader工作分两种情况:1.文件大小小于limit参数,url-loader将会把文件转为DataURL;2.文件大小大于limit,url-loader会调用file-loader进行处理,参数也会直接传给file-loader。因此我们只需要安装url-loader即可。

https://blog.csdn.net/qq_38652603/article/details/73835153
https://www.npmjs.com/package/url-loader

**webpack.ProvidePlugin: **
自动加载模块,而不必到处 importrequire

copy-webpack-plugin:
把我们自己建的文件或是整个目录复制到打包目录下。
https://www.npmjs.com/package/copy-webpack-plugin

webpack-bundle-analyzer:
会给你打包后的 bundles 创建一个可交互的 树形映射图,来查看究竟打包了写什么,哪些体积比较大等,便于优化。像这样。

image.png

babel-loader 很慢问题解决方案

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容