美文网首页
webpack常用设置

webpack常用设置

作者: 小仙有毒_1991 | 来源:发表于2020-09-01 14:42 被阅读0次

作者:美团点评点餐
来源: 掘金

本文主要介绍下webpack常用的loader和plugin

loader的使用方式

一般loader的使用方式在配置文件webpack.config.js中配置

module.exports = {
  module: {
    rules: [
      {
        test: /\.txt$/,
        use: 'raw-loader'
      }
    ]
  }
}

webpack常用的loader

  • 样式:style-loader、css-loader、less-loader、sass-loader等
  • 文件:raw-loader、file-loader 、url-loader等
  • 编译:babel-loader、coffee-loader 、ts-loader等
  • 校验测试:mocha-loader、jshint-loader 、eslint-loader等

比如下面配置,可以匹配.scss的文件,分别经过less-loader、css-loader、style-loader的处理。less-loader转化less为css文件,并且包一层module.exports成为一个js module。style-loader将创建一个style标签将css文件嵌入到html中。css-loader则处理其中的@import和url()。

module.exports = {
  module: {
    rules: [
        {
          test: /\.less$/,
          use:[
              {loader:'style-loader'},
              {loader:'css-loader',options:{sourceMap:true,modules:true}},
              {loader:'less-loader',options:{sourceMap:true}}
          ],
          exclude:/node_modules/
      }
    ]
  }
}
  • vue-loader、coffee-loader、babel-loader等可以将特定文件格式转成js模块、将其他语言转化为js语言和编译下一代js语言

  • file-loader、url-loader等可以处理资源,file-loader可以复制和放置资源位置,并可以指定文件名模板,用hash命名更好利用缓存。

  • url-loader可以将小于配置limit大小的文件转换成内敛Data Url的方式,减少请求。

  • raw-loader可以将文件已字符串的形式返回

  • imports-loader、exports-loader等可以向模块注入变量或者提供导出模块功能,常见场景是:
    1:jquery插件注入,imports-loader?=jquery
    2:禁用AMD,imports-loader?define=false
    等同于:var $ = require("jquery") 和 var define = false;

  • expose-loader:暴露对象为全局变量
    如何写一个loader:官网介绍how to write a loader

    下面是一个简单的raw-loader,它可以将文本类文件转成字符串到js文件中。其中this.cacheable、this.value等是loader的api,分别是将结果标记为可缓存和把值传递给下一个loader。

module.exports = function(content) {
  this.cacheable && this.cacheable();
  this.value = content;
  return "module.exports = " + JSON.stringify(content);
}

webpack的plugin比loader强大,通过钩子可以涉及整个构建流程,可以做一些在构建范围内的事情。

webpack常用的plugin

  • 官网介绍plugins

  • 第三方插件awesome-webpack

  • 首先webpack内置UglifyJsPlugin,压缩和混淆代码。

  • webpack内置CommonsChunkPlugin,提高打包效率,将第三方库和业务代码分开打包。

  • ProvidePlugin:自动加载模块,代替require和import

      new webpack.ProvidePlugin({
        $: 'jquery',
        jQuery: 'jquery'
      })复制代码
    
  • html-webpack-plugin可以根据模板自动生成html代码,并自动引用css和js文件

  • extract-text-webpack-plugin 将js文件中引用的样式单独抽离成css文件

  • DefinePlugin 编译时配置全局变量,这对开发模式和发布模式的构建允许不同的行为非常有用。

    new webpack.DefinePlugin({
      PRODUCTION: JSON.stringify(true),
      VERSION: JSON.stringify("5fa3b9"),
      BROWSER_SUPPORTS_HTML5: true,
      TWO: "1+1",
      "typeof window": JSON.stringify("object")
    })复制代码
    
  • HotModuleReplacementPlugin 热更新

    • 添加HotModuleReplacementPlugin
    • entry中添加 "webpack-dev-server/client?http://localhost:8080/",
    • entry中添加 "webpack/hot/dev-server"
    • (热更新还可以直接用webpack_dev_server --hot --inline,原理也是在entry中添加了上述代码)
  • webpack 内置的DllPluginDllReferencePlugin相互配合,前置第三方包的构建,只构建业务代码,同时能解决Externals多次引用问题。DllReferencePlugin引用DllPlugin配置生成的manifest.json文件,manifest.json包含了依赖模块和module id的映射关系

  • babili-webpack-plugin、transform-runtime 、transform-object-rest-spread

    • babili-webpack-plugin:构建在babel之上 why
    • transform-runtime :解决了babel在每个文件都插入了辅助代码,代码体积过大的问题。
    • transform-object-rest-spread:
      Transform rest properties for object destructuring assignment and spread properties for object literals
      为对象字面量添加解构赋值和spread属性
  • optimize-css-assets-webpack-plugin 不同组件中重复的css可以快速去重

  • webpack-bundle-analyzer 一个webpack的bundle文件分析工具,将bundle文件以可交互缩放的treemap的形式展示。

  • compression-webpack-plugin 生产环境可采用gzip压缩JS和CSS

  • happypack:通过多进程模型,来加速代码构建

        const os = require('os');
        let HappyPack = require('happypack');
        let happyThreadPool = HappyPack.ThreadPool({size: os.cpus().length});
        exports.plugins = [
          new HappyPack({
            id: 'jsx',
            threadPool: happyThreadPool,
            loaders: [ 'babel-loader' ]
          }),
    
          new HappyPack({
            id: 'coffeescripts',
            threadPool: happyThreadPool,
            loaders: [ 'coffee-loader' ]
          })
        ];
    
        exports.module.loaders = [
          {
            test: /\.js$/,
            loaders: [ 'happypack/loader?id=jsx' ]
          },
          {
            test: /\.coffee$/,
            loaders: [ 'happypack/loader?id=coffeescripts' ]
          },
        ]
    

相关文章

网友评论

      本文标题:webpack常用设置

      本文链接:https://www.haomeiwen.com/subject/pmdvsktx.html