webpack loader vs plugin
loader 和 plugin 差异
在 webpack 中,loader 和 plugin 是两个不同的概念,它们分别用于不同的任务。
Loader 用于对模块的源代码进行转换,将非 JavaScript 文件(如 TypeScript、ES6+、Sass、Less 等)转换为 webpack 可以处理的有效模块,并且可以链式调用多个 loader 对文件进行处理。例如,babel-loader 用于将 ES6+ 代码转换为向后兼容的 JavaScript,css-loader 用于解析处理 CSS 文件等。
Plugin 用于执行更广泛的任务,它可以用于执行各种任务,包括打包优化、资源管理、注入环境变量等。插件可以监听 webpack 构建生命周期的事件,并在适当的时机执行自定义的任务。例如,html-webpack-plugin 用于根据模板自动生成 HTML 代码,clean-webpack-plugin 用于清理每次打包下没有使用的文件,uglifyjs-webpack-plugin 用于压缩混淆 JS 代码等。
因此,可以简单地理解为 loader 用于处理模块的源代码转换,而 plugin 用于执行更广泛的构建任务和优化。在 webpack 的配置中,loader 通常用于 module.rules,而 plugin 通过 plugins 属性进行配置。
常用 loader
| Loader | 功能 |
|---|---|
| style-loader | 将 CSS 代码注入到 DOM 中的 style 标签中 |
| css-loader | 解析 CSS 文件,处理 @import 和 url() 等语句 |
| less-loader | 将 Less 文件编译为 CSS |
| sass-loader | 将 Sass/SCSS 文件编译为 CSS |
| raw-loader | 将文件以字符串的形式导入 |
| file-loader | 处理文件,将文件复制到输出目录,并返回相对 URL |
| url-loader | 类似 file-loader,但可以将小文件转换为 base64 URL |
| csv-loader | 解析 CSV 文件 |
| xml-loader | 解析 XML 文件 |
| mocha-loader | 在 Mocha 测试框架中运行测试 |
| jshint-loader | 使用 JSHint 进行 JavaScript 代码的静态分析 |
| eslint-loader | 使用 ESLint 进行 JavaScript 代码的静态分析 |
| babel-loader | 将 ES6+ 代码转换为向后兼容的 JavaScript |
| coffee-loader | 将 CoffeeScript 代码编译为 JavaScript |
| ts-loader | 将 TypeScript 代码编译为 JavaScript |
常用 plugin
| 插件名称 | 功能 |
|---|---|
| html-webpack-plugin | 根据模板自动生成 HTML 代码,并自动引用 CSS 和 JS 文件 |
| extract-text-webpack-plugin | 将 JS 文件中引用的样式单独抽离成 CSS 文件 |
| optimize-css-assets-webpack-plugin | 快速去重不同组件中重复的 CSS |
| webpack-bundle-analyzer | webpack 的 bundle 文件分析工具,以可交互缩放的 treemap 形式展示 bundle 文件 |
| compression-webpack-plugin | 生产环境可采用 gzip 压缩 JS 和 CSS |
| happypack | 通过多进程模型来加速代码构建 |
| clean-webpack-plugin | 清理每次打包下没有使用的文件 |
| MiniCssExtractPlugin | 将 CSS 提取为独立的文件,支持按需加载 CSS 和 source map |
| CopyWebpackPlugin | 复制文件和文件夹,用于构建结束后复制一些静态资源到输出目录 |
| ImageminWebpackPlugin | 用于压缩图片文件 |
| ProvidePlugin | 在每个模块中注入变量,使其在所有模块中可用,无需显式引入 |
| BundleAnalyzerPlugin | 分析 bundle 内容,帮助优化构建输出 |
| DefinePlugin | 允许在编译时创建全局常量,可以在开发和生产构建中使用不同的值 |
| HotModuleReplacementPlugin | 在应用程序运行过程中替换、添加或删除模块,而无需重新加载整个页面 |
| FriendlyErrorsWebpackPlugin | 友好地输出 webpack 构建信息和错误日志 |
| DllPlugin 和 DllReferencePlugin | 用于分离第三方库,提高构建速度 |