<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      vue-cli文檔
      1.webpack-chain

      1.定義

      • 通過鏈式調用操作webpack 配置對象。(chain:鏈子) 直接修改配置對象
      • chainWebpack 通過鏈式編程的形式,來修改默認的 webpack 配置

      2.包含的對象ChainedMap和ChainSet

      1.ChainedMap

      // 1、從 Map 移除所有 配置
      clear()
      
      // 2、通過鍵值從 Map 移除單個配置
      delete(key)
      
      // 3、獲取 Map 中相應鍵的值
      // 注意:返回值是該 key 對應的值
      get(key)
      
      // 4、獲取 Map 中相應鍵的值
      // 如果鍵在 Map 中不存在,則 ChainedMap 中該鍵的值會被配置為 fn 的返回值.
      // 注意:返回值是該 key 對應的值,或者 fn 返回的值
      getOrCompute(key, fn)
      
      // 5、配置 Map 中 已存在的鍵的值
      set(key, value)
      
      // 6、Map 中是否存在一個配置值的特定鍵,
      // 注意:返回 boolean
      has(key)
      
      // 7、返回 Map 中已存儲的所有值的數組
      // 注意:返回 Array
      values()
      
      // 8、返回 Map 中全部配置的一個對象, 其中 鍵是這個對象屬性,值是相應鍵的值,
      entries()
      
      // 9、 提供一個對象,這個對象的屬性和值將 映射進 Map
      merge(obj, omit)
      
      // 10、對當前配置上下文執行函數 handler
      batch(handler)
      
      // 11、條件執行一個函數去繼續配置
      // condition: Boolean
      // whenTruthy: 當條件為真,調用把 ChainedMap 實例作為單一參數傳入的函數
      // whenFalsy: 當條件為假,調用把 ChainedMap 實例作為單一參數傳入的函數
      when(condition, whenTruthy, whenFalsy) 
      
      

      2.ChainSet

      // 末尾增加一個值
      add(value)
      // 在開始位置增加一個值
      prepend(value)
      // 清空 set 內容
      clear()
      // 刪除某個值
      delete(value)
      // 判斷是否有某個值
      has(value)
      // 返回值列表
      values()
      // 合并給定的數組到 Set 尾部。
      merge(arr)
      // handler: ChainSet => ChainSet
      // 一個把 ChainSet 實例作為單個參數的函數
      batch(handler)
      // condition: Boolean
      // whenTruthy: ChainSet -> any, 條件為真時執行
      // whenFalsy: ChainSet -> any, 條件為假時執行
      when(condition, whenTruthy, whenFalsy) 
      
      

      3.常用方法

      1. toString() 調試

      config
        .module
          .rule('compile')
            .test(/\.js$/)
            .use('babel')
              .loader('babel-loader');
      
      config.toString();
      
      // 轉換后的輸出
      {
        module: {
          rules: [
            /* config.module.rule('compile') */
            {
              test: /\.js$/,
              use: [
                /* config.module.rule('compile').use('babel') */
                {
                  loader: 'babel-loader'
                }
              ]
            }
          ]
        }
      }
       
      
      

      2. toConfig()導出配置

      const Config = require('webpack-chain');
      const config = new Config();
      console.log(config.toConfig()) 
      
      

      3. proxy代理

      chainWebpack: config => {
          config.devServer.port(8888)
            .open(true)
            .proxy({'/dev': {
                       target: 'http://127.0.0.1:80/',
                       changeOrigin: true,
                       pathRewrite: {
                         '^/dev': ''
                       }
                     }
                 })
        }
      // chain其他隊proxy的配置
      config.devServer
        .host(host)
        .hot(hot)
        .hotOnly(hotOnly)
        .port(port)
        .progress(progress)
        .proxy(proxy)
        .public(public)
        .publicPath(publicPath)
       
      
      

      4. loader

      // 配置一個新的 loader
      config.module
      .rule('babel')
      .test(/\.(js|jsx|mjs|ts|tsx)$/)
      .include
        .add(path.resolve(__dirname,  'src'))
        .end()
      .use('babel-loader')
        .loader('babel-loader')
        .options({
          'presets':['@babel/preset-env']
        })
      
      // 等同于以下 webpack 配置
      module: {
        rules: [
          {
            test: /\.(js|jsx|mjs|ts|tsx)$/,
            include: [
              path.resolve(__dirname,  'src')
            ],
            use: [
              {
                loader: 'babel-loader',
                options: {
                    presets: [
                      '@babel/preset-env'
                    ]
                  }
              }
            ]
          }
        ]
      } 
      
      //修改loader
      config.module
        .rule('ts')
        .test(/\.tsx?/)
        .use('ts-loader')
          .loader('ts-loader')
          .tap(option => {
            // 一系列
            return options;
          })
          .end()
          
       //移除loader
       config.module
        .rule('ts')
        .test(/\.tsx?/)
        .uses.delete('ts-loader')
          
      
      

      5. plugin

          //新增
          //gzip壓縮 
          const CompressionWebpackPlugin = require('compression-webpack-plugin');
          const productionGzipExtensions = ['js', 'css'];
          config.plugin('CompressionWebpackPlugin').use(CompressionWebpackPlugin, [
            {
              filename: '[path].gz[query]',
              algorithm: 'gzip',
              test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'), // 匹配文件名
              threshold: 10240, // 對超過10K的數據進行壓縮
              minRatio: 0.8, // 極小比
            }
          ]);
         //等價于
          module.exports = { 
          plugins:
              [new CompressionPlugin(
                  {
                      filename: '[path].gz[query]',
                      algorithm: 'gzip',
                      test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'), // 匹配文件名
                      threshold: 10240, // 對超過10K的數據進行壓縮
                      minRatio: 0.8, // 極小比
                }
              )
             ] }; 
             
             
      //移除
      config.plugins.delete('CompressionWebpackPlugin')
      
      //插入
      const htmlWebpackPlugin = require('html-webpack-plugin');
      config.plugin('html')
        .use(htmlWebpackPlugin)
        .before('extract')
        
      // 使用 tap 方法修改參數
      config
        .plugin(name)
        .tap(args => newArgs)
        
        
      
      

      6. 條件判斷

        config
            .when(process.env.NODE_ENV === 'development', //如果是開發環境
              config => {
                  //在條件里配置 config
              }
           )
      
      

      4. vue-cli 中的chain配置

      
      const webpack = require('webpack')
      const CompressionWebpackPlugin = require('compression-webpack-plugin');
      
      module.exports = {
          publicPath: '/',
          outputDir: 'dist',
          assetsDir: 'static',
          productionSourceMap: false,
          devServer: {
            port: port,
            open: true,
            overlay: {
              warnings: false,
              errors: true
            },
            proxy: {
              "/api/": {
                target: "http://127.0.0.1:7001",
                changeOrigin: true,
                pathRewrite: {
                  '^/api': ""
                }
              },
            }
          },
          configureWebpack: {
            name: name,
            resolve: {
              alias: {
                '@': resolve('src')
              }
            },
            externals: cdn.externals,
          },
          chainWebpack(config) { //這里使用的是 vue-cli自帶的 webpackchain
           
          config.plugin('define').tap(args => {//新增環境變量
            args[0]['process.env'].BUILD_ENV = JSON.stringify(process.env.BUILD_ENV)
            return args
          }) 
          //打開gzip 直接執行
          const productionGzipExtensions = ['js', 'css'];
          config.plugin('CompressionWebpackPlugin').use(CompressionWebpackPlugin, [
              {
              filename: '[path].gz[query]',
              algorithm: 'gzip',
              test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'), // 匹配文件名
              threshold: 10240, // 對超過10K的數據進行壓縮
              minRatio: 0.8, // 極小比
              }
          ]);
      
            //當滿足條件執行
            config
            .when(process.env.NODE_ENV === 'production',
              config => {
                config
                  .plugin('ScriptExtHtmlWebpackPlugin')
                  .after('html')
                  .use('script-ext-html-webpack-plugin', [{
                    inline: /runtime\..*\.js$/
                  }])
                  .end()
               //分片優化
                config
                  .optimization.splitChunks({
                    chunks: 'all',
                    cacheGroups: {
                      libs: {
                        name: 'chunk-libs',
                        test: /[\\/]node_modules[\\/]/,
                        priority: 10,
                        chunks: 'initial'
                      },
                      commons: {
                        name: 'chunk-commons',
                        test: resolve('src/components'), // can customize your rules
                        minChunks: 3, //  minimum common number
                        priority: 5,
                        reuseExistingChunk: true
                      }
                    }
                  })
              }
            )//條件結束
            
          }//chain配置結束
      
      }
      
      

      2.configureWebpack

      configureWebpack 通過操作對象的形式,來修改默認的 webpack 配置,該對象將會被 webpack-merge 合并入最終的 webpack 配置。

      const path = require('path');
      function resolve (dir) {
        return path.join(__dirname, dir)
      }
      
      module.exports = {
        devServer: {
          ...
        }, 
        lintOnSave: false, // eslint-loader 是否在保存的時候檢查
        productionSourceMap: false, // 生產環境是否生成 sourceMap 文件
        filenameHashing: true, //文件hash
        configureWebpack: config => {
          if (isProduction) {
            ...
          } else {
            ...
          }
          //返回一個將要合并的對象
          return {
            resolve: {
              alias: {
                '@asset':resolve('src/assets')
              }
            }
          } 
        }
      } 
      
      
      posted on 2024-08-27 11:32  ygunoil  閱讀(1223)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 明星| 丁香婷婷色综合激情五月| 亚洲色大成网站WWW永久麻豆| 狠狠色狠狠色综合| 欧美成人h精品网站| 久久精产国品一二三产品| 日韩幕无线码一区中文| 新婚少妇无套内谢国语播放| 白白发布视频一区二区视频| 亚洲av鲁丝一区二区三区黄| 亚洲av午夜福利精品一区二区| 亚洲香蕉网久久综合影视| 国产一区二区精品偷系列| 国产精品成人久久电影| 夜夜躁狠狠躁2021| 91精品国产蜜臀在线观看| 少妇无套内谢免费视频| 博白县| 精品久久久无码中文字幕 | 国产在线无码视频一区二区三区| 武宁县| 2022最新国产在线不卡a| 亚洲熟女乱综合一区二区三区 | 人妻夜夜爽天天爽三区丁香花| 亚洲粉嫩av一区二区黑人| 亚洲性图日本一区二区三区| 色窝窝免费一区二区三区| 无码国内精品人妻少妇| 狼人大伊人久久一区二区| 蜜臀av色欲a片无码精品一区| 日韩av日韩av在线| 欧美亚洲国产日韩一区二区| 熟女系列丰满熟妇AV| 四虎成人在线观看免费| 18禁网站免费无遮挡无码中文| 亚洲av永久无码精品漫画| av中文字幕一区人妻| 国产成人8X人网站视频| 承德县| 中文国产不卡一区二区| 亚洲欧美激情另类|