Webpack 管理资源

在 webpack 出现之前,前端开发人员会使用 grunt gulp 等工具来处理资源。webpack将 动态打包 所有依赖,因为每个模块都可以明确表述自身依赖,可以避免打包未使用的模块。我们可以通过 loader 引入任何其他类型的文件。

加载CSS文件

为了在js模块中引入CSS文件,需要安装 style-loadercss-loader,并在 module 中配置这些loader。

直接引入css

我们尝试直接引入css,在src下新建一个 index.css 文件随便写些样式,随后引入到 index.js,如下:

  1. .hello{
  2. color: red;
  3. font-size: 30px;
  4. }
  1. import Hello from './hello'
  2. import './index.css'
  3. Hello()

执行 npx webpack --watch发现报错,说明不支持加载 css 模块。
image.png

安装

  1. npm install css-loader style-loader -D

配置

  1. const path = require('path')
  2. const HtmlWebpackPlugin = require('html-webpack-plugin'); // 引入 html-webpack-plugin 插件
  3. module.exports = {
  4. entry: './src/index.js', // 入口文件路径
  5. output: { // 出口文件
  6. filename: 'bundle.js', // 出口文件名
  7. path: path.resolve(__dirname, './dist'), // 出口文件路径
  8. clean: true // 生成新文件的同时是否删除旧文件
  9. },
  10. mode: 'development', // 设置模式 'none' | 'development' | 'production'
  11. devServer: {
  12. static: './dist' // 路径
  13. },
  14. plugins: [
  15. new HtmlWebpackPlugin({ // 实例化 HtmlWebpackPlugin,它将帮我们生成一个 dist/index.html 文件
  16. template: './index.html', // 指定模板
  17. filename: 'app.html', // 生成的文件名
  18. inject: 'body' // script标签的生成位置
  19. })
  20. ],
  21. module: {
  22. rules: [ // 配置资源模块
  23. {
  24. test: /\.css$/, // 利用正则匹配以 .css 结尾的文件
  25. use: ['style-loader', 'css-loader'] // 使用的 loader
  26. }
  27. ]
  28. }
  29. }const path = require('path')
  30. module.exports = {
  31. entry: './src/index.js', // 入口文件路径
  32. output: { // 出口文件
  33. filename: 'bundle.js', // 出口文件名
  34. path: path.resolve(__dirname, './dist'), // 出口文件路径
  35. clean: true // 生成新文件的同时是否删除旧文件
  36. },
  37. mode: 'development', // 设置模式 'none' | 'development' | 'production'
  38. devServer: {
  39. static: './dist' // 路径
  40. },
  41. module: {
  42. rules: [ // 配置资源模块
  43. {
  44. test: /\.css$/, // 利用正则匹配以 .css 结尾的文件
  45. use: ['css-loader', 'style-loader'] // 使用那些 loader
  46. }
  47. ]
  48. }
  49. }

引用css

  1. import Hello from './hello'
  2. import './index.css'
  3. Hello()
  4. const text = document.createElement('span')
  5. text.textContent = 'Hello css-loader and style-loader'
  6. document.body.appendChild(text)
  7. document.body.classList.add('hello')

效果

在页面看到css样式加载成功了,说明 css-loader 和 style- loader 可以帮助我们加载 css文件。
image.png

注意:

在配置 loader 的时候,必须是 style- loader 在前,css-loader 在后,否则会报错。我们的loader是支持链式调用的,并且是逆序的,第一个loader会把结果传给第二个loader所以,顺序很重要!

加载CSS预处理工具less,sass

安装

  1. npm install less-loader less -D

配置

  1. module: {
  2. rules: [ // 配置资源模块
  3. {
  4. test: /\.(css|less)$/, // 利用正则匹配以 .css 结尾的文件
  5. use: ['css-loader', 'style-loader','less-loader'] // 使用那些 loader
  6. }
  7. ]
  8. }

注意:顺序同样不可变,用法和上面 css-loader 相同,sass也一样

抽离/压缩 CSS 样式

安装

  1. npm install mini-css-extract-plugin -D

配置

  1. const MiniCssExtractPlugin = require('mini-css-extract-plugin'); // 引入 mini-css-extract-plugin 插件
  2. plugins: [
  3. new MiniCssExtractPlugin({ // 实例化
  4. filename: 'styles/[contenthash].css' // 自定义打包生成的文件名
  5. })
  6. ],
  7. module: {
  8. rules: [ // 配置资源模块
  9. {
  10. test: /\.css$/, // 利用正则匹配以 .css 结尾的文件
  11. use: [MiniCssExtractPlugin.loader, 'css-loader'] // 将原来的 style-loader 改为 MiniCssExtractPlugin.loader
  12. }
  13. ]
  14. }

运行 npx webpack 打包发现 dist 文件夹下 生成了一个 styles 文件夹,下面有一个哈希字符串文件名的 css 文件

优化

我们发现打包生成的 css 文件并没有压缩,这会影响我们的效率,所以我们借用一个新的插件来进行压缩

安装
  1. npm install css-minimizer-webpack-plugin -D

配置
  1. const CssMinizerPlugin = require('css-minimizer-webpack-plugin'); // 引入 css-minimizer-webpack-plugin 插件
  2. mode: 'production', // 这里要改为 production 模式
  3. optimization: { // 这个要在 mode 同级新增
  4. minimizer: [
  5. new CssMinizerPlugin()
  6. ]
  7. }

运行 npx webpack 打包发现 css 已经是压缩后的了

加载 images 图像

我们之前已经使用过 Asset Modals 这里我们直接可以加载 images 图像资源

  1. .hello-bg {
  2. background-image: url('./lsy.png') !important; // 引入背景图片
  3. }
  1. import Hello from './hello'
  2. import './index.css'
  3. Hello()
  4. const text = document.createElement('span')
  5. text.textContent = 'Hello css-loader and style-loader'
  6. document.body.appendChild(text)
  7. document.body.classList.add('hello')
  8. text.classList.add('hello-bg') // 添加 classname