14webpack之loader

Posted 燕子fly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14webpack之loader相关的知识,希望对你有一定的参考价值。

webpack之loader作用

loader是一种打包的方案,webpack默认只识别js结尾的文件,当遇到其他格式的文件后,webpack并不知道如何去处理。此时,我们可以定义一种规则,告诉webpack当他遇到某种格式的文件后,去求助于相应的loader。

      const path = require(‘path‘);

      module.exports = {
        // 模式:可选为:development, 默认为:production
        mode: ‘development‘,
        // 源代码文件夹:src
        entry: {
          main: ‘./src/index.js‘ // 入口文件
        },
        module: {
          rules: [{
              test: /.jpg$/,
              use: {
                  loader: ‘file-loader‘
              }
          }]
        },
        output: {
          filename: ‘bundle.js‘,  // 文件名
          path: path.resolve(__dirname, ‘dist‘)  // 文件夹
        }
      }
  

打包静态资源

file-loader
      const path = require(‘path‘);

      module.exports = {
        mode: ‘production‘,
        entry: {
          main: ‘./src/index.js‘ // 入口文件
        },
        module: {
          rules: [{
              test: /.(jpg|png|gif)$/,
              use: {
                  loader: ‘file-loader‘,
                  options: { // 配置
                    name: ‘[name].[ext]‘, // 以源文件名字及格式输出
                    outputPath: ‘images/‘ // 输出到images文件夹下
                  }
              }
          }]
        },
        output: {
          filename: ‘bundle.js‘,  // 文件名
          path: path.resolve(__dirname, ‘dist‘)  // 文件夹
        }
      }
  

url-loader

url-loader和file-loader都可以打包图片,区别是url-loader会将图片以base64打包到js文件中,当图片过大时,打包的js文件也会过大。所以最佳实践是:将小图片打包为base64,大于某个值的文件打包为图片。如果在配置中不加limit,所有图片都会打包为base64。 下面案例的意思是:超过10kb的文件打包为图片,小于10kb的打包为base64

      npm install url-loader --save-dev
      const path = require(‘path‘);
      
      module.exports = {
        mode: ‘production‘,
        entry: {
          main: ‘./src/index.js‘ // 入口文件
        },
        module: {
          rules: [{
              test: /.(jpg|png|gif)$/,
              use: {
                  loader: ‘url-loader‘,
                  options: { // 配置
                    name: ‘[name].[ext]‘, // 以源文件名字及格式输出
                    outputPath: ‘images/‘, // 输出到images文件夹下
                    limit: 10240 // 超过10kb打包为图片
                  }
              }
          }]
        },
        output: {
          filename: ‘bundle.js‘,  // 文件名
          path: path.resolve(__dirname, ‘dist‘)  // 文件夹
        }
      }
  

字体:file-loader

      const path = require(‘path‘);

      module.exports = {
        mode: ‘production‘,
        entry: {
          main: ‘./src/index.js‘ // 入口文件
        },
        module: {
          rules: [{
              test: /.(eot|ttf|svg)$/,
              use: {
                  loader: ‘file-loader‘          
              }
          }]
        },
        output: {
          filename: ‘bundle.js‘,  // 文件名
          path: path.resolve(__dirname, ‘dist‘)  // 文件夹
        }
      }
      
  

样式:style-loader css-loader

css-loader会理清多个css文件之间的引用关系,最后合并为一个。

style-loader会将css样式挂载到head的style标签中

        npm install style-loader css-loader -D
        sass-loader
        将scss文件编译为css
        
        npm install sass-loader node-sass --save-dev
        const path = require(‘path‘);
        
        module.exports = {
          mode: ‘production‘,
          entry: {
            main: ‘./src/index.js‘ // 入口文件
          },
          module: {
            rules: [{
                test: /.(jpg|png|gif)$/,
                use: {
                    loader: ‘url-loader‘,
                    options: { // 配置
                      name: ‘[name].[ext]‘, // 以源文件名字及格式输出
                      outputPath: ‘images/‘, // 输出到images文件夹下
                      limit: 10240 // 超过10kb打包为图片
                    }
                }
            },{
                test: /.scss$/,
                use: [
                  ‘style-loader‘,
                  ‘css-loader‘,
                  ‘sass-loader‘
                ]
            }]
          },
          output: {
            filename: ‘bundle.js‘,  // 文件名
            path: path.resolve(__dirname, ‘dist‘)  // 文件夹
          }
        }
        详细配置
        
        const path = require(‘path‘);
        
        module.exports = {
          mode: ‘production‘,
          entry: {
            main: ‘./src/index.js‘ // 入口文件
          },
          module: {
            rules: [{
                test: /.(jpg|png|gif)$/,
                use: {
                    loader: ‘url-loader‘,
                    options: { // 配置
                      name: ‘[name].[ext]‘, // 以源文件名字及格式输出
                      outputPath: ‘images/‘, // 输出到images文件夹下
                      limit: 10240 // 超过10kb打包为图片
                    }
                }
            },{
                test: /.scss$/,
                use: [
                  ‘style-loader‘,
                  {
                    loader: ‘css-loader‘,
                    options: { // 配置
                      importLoaders: 1, // scss文件中引用的scss文件也经过下面的一个loader打包
                      modules: true // 开启模块化css,引入的css仅在当前模块有效,而不是全局
                    }
                  },
                  ‘sass-loader‘
                ]
            }]
          },
          output: {
            filename: ‘bundle.js‘,  // 文件名
            path: path.resolve(__dirname, ‘dist‘)  // 文件夹
          }
        }
    

postcss-loader

        为样式加上厂商浏览器前缀

        npm i -D postcss-loader
        const path = require(‘path‘);
        
        module.exports = {
          mode: ‘production‘,
          entry: {
            main: ‘./src/index.js‘ // 入口文件
          },
          module: {
            rules: [{
                test: /.(jpg|png|gif)$/,
                use: {
                    loader: ‘url-loader‘,
                    options: { // 配置
                      name: ‘[name].[ext]‘, // 以源文件名字及格式输出
                      outputPath: ‘images/‘, // 输出到images文件夹下
                      limit: 10240 // 超过10kb打包为图片
                    }
                }
            },{
                test: /.scss$/,
                use: [
                  ‘style-loader‘,
                  ‘css-loader‘,
                  ‘sass-loader‘,
                  ‘postcss-loader‘
                ]
            }]
          },
          output: {
            filename: ‘bundle.js‘,  // 文件名
            path: path.resolve(__dirname, ‘dist‘)  // 文件夹
          }
        }
    

autoprefixer插件

        npm install autoprefixer -D
        postcss.config.js
        
        module.exports = {
            plugins: [
              require(‘autoprefixer‘)
            ]
        }
    

以上是关于14webpack之loader的主要内容,如果未能解决你的问题,请参考以下文章

webpack实战之手写一个loader和plugin

webpack3.0之loader配置及编写

14 webpack中url-loader的使用

webpack配置之自定义loader

webpack进阶之loader篇

webpack4 配置之 postcss-loader