• Webpack 中 Loader 和 Plugin 对比


    对于 Webpack 的应用,其实最主要的就是在 Loader 和 Plugin 上面。

    那么想用好,首先就要了解清楚这两个。

    一、打包流程

     在对比前,先来了解下 Webpack 的打包流程。

    1. 初始化参数:从 shell 语句和配置文件中读取,并合并参数,得出最终的参数
    2. 开始编译:用上一步得到的参数初始化 Compiler 对象,加载所有插件,执行对象的 run 方法开始编译
    3. 确定入口:根据配置文件中的 entry 找到所有入口文件
    4. 编译模块:从入口文件出发,调用所有配置的 Loader 对文件进行预编译,找出入口文件所依赖的文件,依次递归找出所有依赖文件并一 一进行编译(编译文件,收集依赖关系)
    5. 完成模块编译:经过上一步,得到编译后的文件以及依赖关系
    6. 输出资源:根据入口和模块的依赖关系,组装成一个个包含多个模块的 Chunk,再把这些 Chunk 转换成文件添加到输出目录,这里是可以修改输出内容的最后机会
    7. 输出完成:在确定好输出内容,根据配置确定输出的路径、文件名,把要输出内容写入到文件系统

    二、两者区别

    1. 功能角度区分

    • loader

      • loader 从字面意思 加载 的意思

      • 由于 webpack 本身只能打包 commonJS 规范的 js 文件,对于 css、图片等文件没办法打包,就需要第三方模块进行打包(转换器)

      • loader 虽然扩展了 webpack,但是只专注于转化文件(transform)这一领域

      • loader 是运行在 NodeJS 中

      • 仅仅为了打包

    • plugins

      • plugins 完成是 loader 完成不了的功能

      • plugins 也是扩展 webpack,但是是作用于 webpack 本身的;并且不仅限在打包上面,有根据丰富的功能;从打包优化到压缩,重新定义环境变量功能强大到可以用来处理各种各样的任务

      • 插件可以携带参数,所以一般用 new

    1. 运行时机区分

    • loader 运行在打包文件前(loader 是在模块加载前的预处理文件,对应上面打包流程中的 4

    • plugins 在编译的整个周期都起作用,是基于事件机制,监听 webpack 打包过程中的某些节点执行任务

    下面的只是列举下,在这里并不展开

    三、常见的 Loader

    • 处理 CSS 的 loade:style-loader、css-loader、less-loader、scss-loader
    • 处理图片的 loader:url-loader、file-loader
    • 处理 html 的 loader:html-loader
    • 处理 vue 文件的 loader:vue-loader、vue-style-loader

    四、常见的 Plugin

    • html-webpack-plugin:创建空的 HTML 或者根据模板创建,并自动引入打包后的资源(js/css),同时也可以配置压缩 js 和 html
    • copy-webpack-plugin:用于复制不用打包的文件到打包后的指定位置
    • mini-css-extract-plugin:把 css 单独提前,并用 link 引入(这样不容易出现闪屏,js 打包也会变小)
    • optimize-css-assets-webpack-plugin:压缩 CSS 文件
    • DllReferencePlugin:告诉 webpack 哪些不用打包,并且使用的名字也要变
    • add-asset-html-webpack-plugin:将某个文件打包输出,并自动引入(配合上面的 dll 使用)
    • webpack-bundle-analyzer:打包构建分析,会有直接的页面可以展示(可配置关闭)
    • compression-webpack-plugin:压缩打包后的文件
  • 相关阅读:
    Codeforces Round #454 Div. 2 A B C (暂时)
    Codeforces Round #453 Div. 2 A B C D (暂时)
    EOJ Monthly 2017.12 A B C D
    C++调用Matlab引擎 图像读写与处理 (知识+代码篇)
    Codeforces Round #449 Div. 2 A B C (暂时)
    AtCoder Regular Contest 077 E
    hdu 6218 Bridge 线段树 set
    hdu 2243 考研路茫茫——单词情结 AC自动机 矩阵幂次求和
    php配置php-fpm启动参数及配置详解
    PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)
  • 原文地址:https://www.cnblogs.com/zhurong/p/14912161.html
Copyright © 2020-2023  润新知