美文网首页
webpack 常用配置及插件

webpack 常用配置及插件

作者: 风之化身呀 | 来源:发表于2017-12-24 22:27 被阅读88次

    本文记录webpack2中的常用配置项和插件

    1、常用配置

     module.exports = {
      cache: true,  //开启缓存功能,这样只有变化的文件才会重新加载,可提升构建速度
      entry:{},
      output: {},
      module: {},
      resolve: {},
      externals:{},
      plugins:{}
    }
    

    1.1 entry

    • 单入口时key为app,value写上相对于webpack.config.js的入口文件路径即可,如:


      单入口

      注意:value还可以是数组,这种情况要注意顺序,确保主入口在数组的末位上!

    • 多入口时key为app的是主入口,其他key可自己取名,但要加引号,如:


      多入口

      注意:有几个入口,webpack就会打几个包(bundle)出来,打出来的包的文件名与这里的key对应,比如上图会打出类似app.js和vendor.js两个文件(这里省略了hash)。

    1.2 output

    • path
      规定打包后的文件放哪儿,必须是绝对路径,常取值为:
      __dirname+’/build’或path.resolve(__dirname,’build’)
    • filename
      规定打包后的文件的名字,对于单入口文件,可以取一个固定的名字,如’build.js’,对于多入口文件,要使用[name].bundle.js或[id].bundle.js来对应,其中name和id是根据多入口文件对象的属性动态确定的
    • publicPath
      规定线上地址,打包后的文件中资源的引用地址会根据这个地址而改变,一般取为’/assets/’
    • chunkFilename
      webpack可以做代码分割,这个属性规定那些做了代码分割的块(chunk)的名字
      默认使用 [id].js

    1.3 module

    • rules:数组
      数组中每一项类似于这样配置:
         {
            test: /\.js$/,
            loader: 'babel-loader?cacheDirectory=true', //当使用多个loader时,请用use而不是loaders代替loader
            include: [resolve('src'), resolve('test')],
            exclude: [resolve('node_modules')]
          }
    

    有时还会有query或options配置,二者都是use:{options}的简写,所以在用了use后就不需要这两个配置了,如下(一个loader对应一个options,使用多个loader时用use):

    use: [
      {
        loader: 'style-loader'
      },
      {
        loader: 'css-loader',
        options: {
          importLoaders: 1
        }
      },
      {
        loader: 'less-loader',
        options: {
          noIeCompat: true
        }
      }
    ]
    
    • noParser
      防止 webpack 解析任何与给定正则表达式相匹配的文件,忽略大型库文件(library)可以提高构建性能
    noParse: /jquery|lodash/
    

    1.4 resolve

    配置模块如何解析

    • root:字符串或值为字符串的数组,绝对路径,配置alias中依赖项的基地址
    • alias
      创建 import 或 require 的别名,来确保模块引入变得更简单。
      对象,key为变量名,值为路径。key指定的变量将成为全局变量,比如想在任何文件中都是用jquery而不必每次都显示引入,可以这样{$:jquery文件的地址},地址可以是相对地址(相对root指定),也可是绝对地址(使用path.resolve(__dirname,’jquery’)).
    • extensions:数组,文件扩展名,某文件的扩展名在该数组中时,该文件在引入时可省略扩展名,常取值有[‘’ , ’.js’ , ‘.json’ , ‘.scss’ , ‘.vue’]
    • modules
      告诉 webpack 解析模块时应该搜索的目录
    resolve: {
        extensions: ['.js', '.vue', '.json'],
        modules: [
          resolve('src'),     //实际返回了src的路径,会优先于node_modules搜索
          resolve('node_modules')
        ],
        alias: {
          'vue$': 'vue/dist/vue.common.js',
          'src': resolve('src'),
          'assets': resolve('src/assets'),
          'components': resolve('src/components'),
          'styles': resolve('src/styles'),
          'utils':resolve('src/utils'),
          'demos':resolve('src/demos'),
          'cnode':resolve('src/cnode')
        }
      }
    

    1.5 externals

    提供了不从 bundle 中引用依赖的方式。也就是所创建的 bundle 依赖于那些存在于用户环境(consumer environment)中的依赖。比如jquery是用script的方式从html引入的,要想在其他模块中引入的时候就可以使用这个配置

    // html
    <script src="https://code.jquery.com/jquery-3.1.0.js"></script>
    // 配置
    externals: {
      $: 'jQuery'            //key不加引号,value是脚本里的全局对象,这里value还可以是数组或对象,但表示的含义大不一样,可参看[这里](http://www.css88.com/doc/webpack2/configuration/externals/)
    }
    // 其他模块引入的方式
    import $ from 'jquery';
    

    1.6 performance、stat

    performance:某个打包后的包超过给定阈值时给出提示
    stat:控制webpack打包后输出哪些信息

    1.7 plugins

    plugins是除module外最为重要的配置了,插件机制提供了loader无法完成的功能,常用的plugin有:

    • CommonsChunkPlugin
    • DefinePlugin
    • HtmlWebpackPlugin
    • UglifyjsWebpackPlugin
    • ExtractTextWebpackPlugin
    • OptimizeCSSPlugin
    • CompressionWebpackPlugin
    • SourceMapDevToolPlugin
    • FriendlyErrorsPlugin
    • BundleAnalyzerPlugin

    2、插件用法配置

    • CommonsChunkPlugin
    new webpack.optimize.CommonsChunkPlugin(options)
    

    options的配置:
    name:抽取出公共代码后的模块名,若没有filename项,该项也决定打包后的文件名
    chunks:从哪些模块中抽取公共代码,若省略,则从所有模块中抽取(一般是从入口模块抽)
    minChunks:number|Infinity|function(module, count) -> boolean
    为数字A时,表示模块必须被引用超过A次才提取到公共代码里;为infinity时,表示无穷,不抽取任何模块;为函数时,函数返回true就抽取,实例:

                    new webpack.optimize.CommonsChunkPlugin({
                name: 'vendor',
                minChunks: function(module, count) {
                    // any required modules inside node_modules are extracted to vendor
                    return (
                        module.resource &&
                        /\.js$/.test(module.resource) &&
                        module.resource.indexOf(
                            path.join(__dirname, '../node_modules')
                        ) === 0
                    )
                }
            })
    
    • DefinePlugin
      允许你创建一个在编译时可以配置的全局常量。
                    new webpack.DefinePlugin({
                'process.env': config.dev.env
            })
    

    注意这里定义的常量是在业务模块中使用的,并不是在webpack这些配置文件中使用,因为webpack本身运行在node环境下,node中自身就有process等全局变量。如在入口main.js中不用声明process.env就可以直接使用process.env判断环境

    • HtmlWebpackPlugin
      生成一个HTML5文件,该文件的 body 中使用script 标记引用了所有 webpack bundle。若有多个webpack入口点,它们都将包含在生成的HTML中,使用script标记引用。如果有任何CSS资源在webpack的 output 中,(例如,使用ExtractTextPlugin提取的CSS)那么这些资源将被包含在HTML head 中,使用 <link> 标记引用。实例:
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    var webpackConfig = {
      entry: 'index.js',
      output: {
        path: 'dist',
        filename: 'index_bundle.js'
      },
      plugins: [new HtmlWebpackPlugin()]
    };
    
    //生成一个文件 dist/index.html
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8">
        <title>webpack App</title>
      </head>
      <body>
        <script src="index_bundle.js"></script>
      </body>
    </html>
    

    配置:

    • title: 生成的html中的title
    • filename: 生成的html的名字
    • template: 用哪个模板来生成html
    • inject:true | 'head' | 'body' | false 取true或body时,all javascript 放在body底部,'head'放head里
    • favicon:指定生成的html的favicon
    • minify:{...} | false 压缩生成的html
    • hash: true | false 是否给所有scripts和css添加hash
    • cache: 只有当html中内容变化了才重新输出,默认true
    • showErrors:true | false 错误细节是否写到html,默认true
    • chunks: 只添加哪些chunk
    • excludeChunks: 去掉哪些chunk
    • UglifyjsWebpackPlugin
    new webpack.optimize.UglifyJsPlugin({
           compress: {
             warnings: false
           },
           sourceMap: true
          })
    // 或使用这个代替
    var ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin')
    new ParallelUglifyPlugin({
          cacheDir: '.cache/',
          uglifyJS: {
            output: {
              comments: false,
              beautify: false
            },
            compress: {
              warnings: false,
              drop_console: true
            }
          }
        }),
    

    配置项和uglify一样的

    • ExtractTextWebpackPlugin
      将所有的 入口chunk (entry chunks) 中的 require("style.css") 或import 'style.css' 移动到分开的 css 文件.
      需要两步:1、rules中配置 ExtractTextPlugin.extract 2、plugins中配置new ExtractTextPlugin("styles.css")
    const ExtractTextPlugin = require("extract-text-webpack-plugin");
    rules: [
          {
            test: /\.css$/,
            use: ExtractTextPlugin.extract({
              fallback: "style-loader",
              use: "css-loader"
            })
          }
        ]
      },
      plugins: [
        new ExtractTextPlugin("styles.css"),
      ]
    
    • OptimizeCSSPlugin
      去除重复的CSS代码
    var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin');
    // 配置
      plugins: [
        new OptimizeCSSPlugin()
      ]
    
    • CompressionWebpackPlugin
      压缩资源
    var CompressionPlugin = require("compression-webpack-plugin");
    // 配置
     plugins: [
            new CompressionPlugin({
                asset: "[path].gz[query]",
                algorithm: "gzip",
                test: /\.js$|\.html$/,
                threshold: 10240,
                minRatio: 0.8
            })
        ]
    

    asset: 目标资源名称。 [file] 会被替换成原始资源。[path] 会被替换成原始资源的路径, [query] 会被替换成查询字符串。默认值是 "[path].gz[query]"。
    algorithm: 可以是 function(buf, callback) 或者字符串。对于字符串来说依照 zlib 的算法(或者 zopfli 的算法)。默认值是 "gzip"。
    test: 所有匹配该正则的资源都会被处理。默认值是全部资源。
    threshold: 只有大小大于该值的资源会被处理。单位是 bytes。默认值是 0。
    minRatio: 只有压缩率小于这个值的资源才会被处理。默认值是 0.8。

    • BundleAnalyzerPlugin
      分析打包构成
    var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
      plugins: [
        new BundleAnalyzerPlugin({
      // Can be `server`, `static` or `disabled`.
      // In `server` mode analyzer will start HTTP server to show bundle report.
      // In `static` mode single HTML file with bundle report will be generated.
      // In `disabled` mode you can use this plugin to just generate Webpack Stats JSON file by setting `generateStatsFile` to `true`.
      analyzerMode: 'server',
      // Host that will be used in `server` mode to start HTTP server.
      analyzerHost: '127.0.0.1',
      // Port that will be used in `server` mode to start HTTP server.
      analyzerPort: 8888,
      // Path to bundle report file that will be generated in `static` mode.
      // Relative to bundles output directory.
      reportFilename: 'report.html',
      // Module sizes to show in report by default.
      // Should be one of `stat`, `parsed` or `gzip`.
      // See "Definitions" section for more information.
      defaultSizes: 'parsed',
      // Automatically open report in default browser
      openAnalyzer: true,
      // If `true`, Webpack Stats JSON file will be generated in bundles output directory
      generateStatsFile: false,
      // Name of Webpack Stats JSON file that will be generated if `generateStatsFile` is `true`.
      // Relative to bundles output directory.
      statsFilename: 'stats.json',
      // Options for `stats.toJson()` method.
      // For example you can exclude sources of your modules from stats file with `source: false` option.
      // See more options here: https://github.com/webpack/webpack/blob/webpack-1/lib/Stats.js#L21
      statsOptions: null,
      // Log level. Can be 'info', 'warn', 'error' or 'silent'.
      logLevel: 'info'
       })
      ]
    

    相关文章

      网友评论

          本文标题:webpack 常用配置及插件

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