1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
      vue-cli3全面配置詳解

      本文介紹了vue-cli3全面配置詳解,分享給大家,具體如下:

      成都網(wǎng)站建設(shè)公司更懂你!創(chuàng)新互聯(lián)只做搜索引擎喜歡的網(wǎng)站!成都網(wǎng)站制作前臺(tái)采用搜索引擎認(rèn)可的DIV+CSS架構(gòu),全站HTML靜態(tài),H5高端網(wǎng)站建設(shè)+CSS3網(wǎng)站,提供:網(wǎng)站建設(shè),微信開(kāi)發(fā),微信小程序開(kāi)發(fā)商城系統(tǒng)網(wǎng)站開(kāi)發(fā)app軟件開(kāi)發(fā)域名注冊(cè),服務(wù)器租售,網(wǎng)站代托管運(yùn)營(yíng),微信公眾號(hào)代托管運(yùn)營(yíng)。

      vue-cli3-config

      創(chuàng)建項(xiàng)目

      配置環(huán)境變量

      通過(guò)在package.json里的scripts配置項(xiàng)中添加--mode xxx來(lái)選擇不同環(huán)境

      在項(xiàng)目根目錄中新建.env, .env.production, .env.analyz等文件

      只有以 VUE_APP_ 開(kāi)頭的變量會(huì)被 webpack.DefinePlugin 靜態(tài)嵌入到客戶端側(cè)的包中,代碼中可以通過(guò)process.env.VUE_APP_BASE_API訪問(wèn)

      NODE_ENV 和 BASE_URL 是兩個(gè)特殊變量,在代碼中始終可用

      .env serve默認(rèn)的環(huán)境變量

      NODE_ENV = 'development'
      VUE_APP_BASE_API = 'https://demo.cn/api'
      VUE_APP_SRC = 'https://wechat-timg.oss-cn-hangzhou.aliyuncs.com/demo'

      .env.production build默認(rèn)的環(huán)境變量

      NODE_ENV = 'production'
      
      VUE_APP_BASE_API = 'https://demo.com/api'
      VUE_APP_SRC = 'https://img-wechat.oss-cn-hangzhou.aliyuncs.com/demo'
      

      .env.analyz 用于webpack-bundle-analyzer打包分析

      NODE_ENV = 'production'
      IS_ANALYZ = 'analyz'
      
      VUE_APP_BASE_API = 'https://demo.com/api'
      VUE_APP_SRC = 'https://img-wechat.oss-cn-hangzhou.aliyuncs.com/demo'
      

      修改package.json

      "scripts": {
       "serve": "vue-cli-service serve",
       "build": "vue-cli-service build",
       "analyz": "vue-cli-service build --mode analyz",
       "lint": "vue-cli-service lint"
      }
      

      配置vue.config.js

      const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
      
      module.exports = {
       baseUrl: './', // 默認(rèn)'/',部署應(yīng)用包時(shí)的基本 URL
       outputDir: process.env.outputDir || 'dist', // 'dist', 生產(chǎn)環(huán)境構(gòu)建文件的目錄
       assetsDir: '', // 相對(duì)于outputDir的靜態(tài)資源(js、css、img、fonts)目錄
       lintOnSave: false,
       runtimeCompiler: true, // 是否使用包含運(yùn)行時(shí)編譯器的 Vue 構(gòu)建版本
       productionSourceMap: false, // 生產(chǎn)環(huán)境的 source map
       parallel: require('os').cpus().length > 1,
       pwa: {}
      };
      
      

      配置proxy跨域

      const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
      module.exports = {
        devServer: {
          // overlay: {
          //  warnings: true,
          //  errors: true
          // },
          open: IS_PROD,
          host: '0.0.0.0',
          port: 8000,
          https: false,
          hotOnly: false,
          proxy: {
           '/api': {
            target: process.env.VUE_APP_BASE_API || 'http://127.0.0.1:8080',
            changeOrigin: true
           }
          }
        }
      }

      修復(fù)HMR(熱更新)失效

      module.exports = {
        chainWebpack: config => {
          // 修復(fù)HMR
          config.resolve.symlinks(true);
        }
      }
      

      添加別名

      const path = require('path');
      const resolve = (dir) => path.join(__dirname, dir);
      const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
      
      module.exports = {
        chainWebpack: config => {
          // 添加別名
          config.resolve.alias
           .set('@', resolve('src'))
           .set('assets', resolve('src/assets'))
           .set('components', resolve('src/components'))
           .set('layout', resolve('src/layout'))
           .set('base', resolve('src/base'))
           .set('static', resolve('src/static'));
        }
      }
      
      

      添加打包分析

      const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
      
      module.exports = {
        chainWebpack: config => {
          // 打包分析
          if (process.env.IS_ANALYZ) {
           config.plugin('webpack-report')
            .use(BundleAnalyzerPlugin, [{
             analyzerMode: 'static',
            }]);
          }
        }
      }
      
      

      配置externals

      防止將某些 import 的包(package)打包到 bundle 中,而是在運(yùn)行時(shí)(runtime)再去從外部獲取這些擴(kuò)展依賴

      module.exports = {
        configureWebpack: config => {
          config.externals = {
           'vue': 'Vue',
           'element-ui': 'ELEMENT',
           'vue-router': 'VueRouter',
           'vuex': 'Vuex',
           'axios': 'axios'
          }
        }
      }
      

      去掉console.log

      方法一:

      const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
      module.exports = {
        configureWebpack: config => {
          if (IS_PROD) {
            const plugins = [];
            plugins.push(
              new UglifyJsPlugin({
                uglifyOptions: {
                  compress: {
                    warnings: false,
                    drop_console: true,
                    drop_debugger: false,
                    pure_funcs: ['console.log']//移除console
                  }
                },
                sourceMap: false,
                parallel: true
              })
            );
            config.plugins = [
              ...config.plugins,
              ...plugins
            ];
          }
        }
      }
      

      方法二:使用babel-plugin-transform-remove-console插件

      npm i --save-dev babel-plugin-transform-remove-console

      在babel.config.js中配置

      const plugins = [];
      if(['production', 'prod'].includes(process.env.NODE_ENV)) { 
       plugins.push("transform-remove-console")
      }
      
      module.exports = {
       presets: [["@vue/app",{"useBuiltIns": "entry"}]],
       plugins: plugins
      };
      
      

      開(kāi)啟gzip壓縮

      npm i --save-dev compression-webpack-plugin
      const CompressionWebpackPlugin = require('compression-webpack-plugin');
      const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;
      
      module.exports = {
        configureWebpack: config => {
          if (IS_PROD) {
            const plugins = [];
            plugins.push(
              new CompressionWebpackPlugin({
                filename: '[path].gz[query]',
                algorithm: 'gzip',
                test: productionGzipExtensions,
                threshold: 10240,
                minRatio: 0.8
              })
            );
            config.plugins = [
              ...config.plugins,
              ...plugins
            ];
          }
        }
      }

      還可以開(kāi)啟比gzip體驗(yàn)更好的Zopfli壓縮詳見(jiàn)https://webpack.js.org/plugins/compression-webpack-plugin

      npm i --save-dev @gfx/zopfli brotli-webpack-plugin
      const CompressionWebpackPlugin = require('compression-webpack-plugin');
      const zopfli = require("@gfx/zopfli");
      const BrotliPlugin = require("brotli-webpack-plugin");
      const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;
      
      module.exports = {
        configureWebpack: config => {
          if (IS_PROD) {
            const plugins = [];
            plugins.push(
              new CompressionWebpackPlugin({
                algorithm(input, compressionOptions, callback) {
                 return zopfli.gzip(input, compressionOptions, callback);
                },
                compressionOptions: {
                 numiterations: 15
                },
                minRatio: 0.99,
                test: productionGzipExtensions
              })
            );
            plugins.push(
              new BrotliPlugin({
                test: productionGzipExtensions,
                minRatio: 0.99
              })
            );
            config.plugins = [
              ...config.plugins,
              ...plugins
            ];
          }
        }
      }
      
      

      為sass提供全局樣式,以及全局變量

      可以通過(guò)在main.js中Vue.prototype.$src = process.env.VUE_APP_SRC;掛載環(huán)境變量中的配置信息,然后在js中使用$src訪問(wèn)。

      css中可以使用注入sass變量訪問(wèn)環(huán)境變量中的配置信息

      module.exports = {
        css: {
          modules: false,
          extract: IS_PROD,
          sourceMap: false,
          loaderOptions: {
           sass: {
            // 向全局sass樣式傳入共享的全局變量
            data: `@import "~assets/scss/variables.scss";$src: "${process.env.VUE_APP_SRC}";`
           }
          }
        }
      }
      

      在scss中引用

      .home {
        background: url($src + '/images/500.png');
      }
      

      添加IE兼容

      npm i --save @babel/polyfill
      

      在main.js中添加

      import '@babel/polyfill';

      配置babel.config.js

      const plugins = [];
      
      module.exports = {
       presets: [["@vue/app",{"useBuiltIns": "entry"}]],
       plugins: plugins
      };
      
      

      完整配置

      安裝依賴

      復(fù)制代碼 代碼如下:
      npm i --save-dev compression-webpack-plugin babel-plugin-transform-remove-console @gfx/zopfli brotli-webpack-plugin

      package.json

      "scripts": {
        "serve": "vue-cli-service serve",
        "build": "vue-cli-service build",
        "analyz": "vue-cli-service build --mode analyz",
        "lint": "vue-cli-service lint"
      }
      

      babel.config.js

      const plugins = [];
      // if(['production', 'prod'].includes(process.env.NODE_ENV)) { 
      //  plugins.push("transform-remove-console")
      // }
      
      module.exports = {
       presets: [["@vue/app",{"useBuiltIns": "entry"}]],
       plugins: plugins
      };
      vue.config.js
      const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
      const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
      const CompressionWebpackPlugin = require('compression-webpack-plugin');
      // const zopfli = require("@gfx/zopfli");
      // const BrotliPlugin = require("brotli-webpack-plugin");
      
      const path = require('path');
      const resolve = (dir) => path.join(__dirname, dir);
      const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
      const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;
      
      module.exports = {
        baseUrl: './', // 默認(rèn)'/',部署應(yīng)用包時(shí)的基本 URL
        outputDir: process.env.outputDir || 'dist', // 'dist', 生產(chǎn)環(huán)境構(gòu)建文件的目錄
        assetsDir: '', // 相對(duì)于outputDir的靜態(tài)資源(js、css、img、fonts)目錄
        lintOnSave: false,
        runtimeCompiler: true, // 是否使用包含運(yùn)行時(shí)編譯器的 Vue 構(gòu)建版本
        productionSourceMap: false, // 生產(chǎn)環(huán)境的 source map
      
        configureWebpack: config => {
          // config.externals = {
          //   'vue': 'Vue',
          //   'element-ui': 'ELEMENT',
          //   'vue-router': 'VueRouter',
          //   'vuex': 'Vuex',
          //   'axios': 'axios'
          // }
      
          if (IS_PROD) {
            const plugins = [];
            plugins.push(
              new UglifyJsPlugin({
                uglifyOptions: {
                  compress: {
                    warnings: false,
                    drop_console: true,
                    drop_debugger: false,
                    pure_funcs: ['console.log']//移除console
                  }
                },
                sourceMap: false,
                parallel: true
              })
            );
            plugins.push(
              new CompressionWebpackPlugin({
                filename: '[path].gz[query]',
                algorithm: 'gzip',
                test: productionGzipExtensions,
                threshold: 10240,
                minRatio: 0.8
              })
            );
            // Zopfli壓縮 https://webpack.js.org/plugins/compression-webpack-plugin/
            // plugins.push(
            //   new CompressionWebpackPlugin({
            //     algorithm(input, compressionOptions, callback) {
            //       return zopfli.gzip(input, compressionOptions, callback);
            //     },
            //     compressionOptions: {
            //       numiterations: 15
            //     },
            //     minRatio: 0.99,
            //     test: productionGzipExtensions
            //   })
            // );
            // plugins.push(
            //   new BrotliPlugin({
            //     test: productionGzipExtensions,
            //     minRatio: 0.99
            //   })
            // );
            config.plugins = [
              ...config.plugins,
              ...plugins
            ];
          }
        },
        chainWebpack: config => {
          // 修復(fù)HMR
          config.resolve.symlinks(true);
      
          // 添加別名
          config.resolve.alias
            .set('@', resolve('src'))
            .set('assets', resolve('src/assets'))
            .set('components', resolve('src/components'))
            .set('layout', resolve('src/layout'))
            .set('base', resolve('src/base'))
            .set('static', resolve('src/static'));
      
          // 打包分析
          if (process.env.IS_ANALYZ) {
            config.plugin('webpack-report')
              .use(BundleAnalyzerPlugin, [{
                analyzerMode: 'static',
              }]);
          }
      
          // 多頁(yè)面配置,為js添加hash
          // config.output.chunkFilename(`js/[name].[chunkhash:8].js`)
      
          // 修改圖片輸出路徑
          // config.module
          //  .rule('images')
          //  .test(/\.(png|jpe?g|gif|ico)(\?.*)?$/)
          //  .use('url-loader')
          //  .loader('url-loader')
          //  .options({
          //    name: path.join('../assets/', 'img/[name].[ext]')
          //  })
        },
        css: {
          modules: false,
          extract: IS_PROD,
          // 為css后綴添加hash
          // extract: {
          // filename: 'css/[name].[hash:8].css',
          // chunkFilename: 'css/[name].[hash:8].css'
          //},
          sourceMap: false,
          loaderOptions: {
            sass: {
              // 向全局sass樣式傳入共享的全局變量
              // data: `@import "~assets/scss/variables.scss";$src: "${process.env.VUE_APP_SRC}";`
              data: `$src: "${process.env.VUE_APP_SRC}";`
            },
            // px轉(zhuǎn)換為rem
            // postcss: {
            //  plugins: [
            //   require('postcss-pxtorem')({
            //    rootValue : 1, // 換算的基數(shù)
            //    selectorBlackList : ['weui', 'el'], // 忽略轉(zhuǎn)換正則匹配項(xiàng)
            //    propList  : ['*']
            //   })
            //  ]
            // }
          }
        },
        pluginOptions: {
          // 安裝vue-cli-plugin-style-resources-loader插件
          // 添加全局樣式global.scss
          // "style-resources-loader": {
          //  preProcessor: "scss",
          //  patterns: [
          //   resolve(__dirname, "./src/scss/scss/variables.scss")
          //  ]
          // }
        },
        parallel: require('os').cpus().length > 1,
        pwa: {},
        devServer: {
          // overlay: {
          //  warnings: true,
          //  errors: true
          // },
          open: IS_PROD,
          host: '0.0.0.0',
          port: 8000,
          https: false,
          hotOnly: false,
          proxy: {
            '/api': {
              target: process.env.VUE_APP_BASE_API || 'http://127.0.0.1:8080',
              changeOrigin: true
            }
          }
        }
      };

      以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


      網(wǎng)頁(yè)名稱(chēng):vue-cli3全面配置詳解
      網(wǎng)站URL:http://www.ef60e0e.cn/article/gjpjps.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        岚皋县| 和顺县| 溧水县| 碌曲县| 南郑县| 名山县| 清流县| 上思县| 大同市| 舞钢市| 凭祥市| 孟村| 谢通门县| 南投县| 长顺县| 钟祥市| 长治市| 许昌县| 亚东县| 寻乌县| 浮梁县| 德昌县| 鄂伦春自治旗| 汾阳市| 镇坪县| 保定市| 祁连县| 集贤县| 明水县| 阳春市| 霍林郭勒市| 铜川市| 民勤县| 长丰县| 安乡县| 疏勒县| 吐鲁番市| 景泰县| 十堰市| 康马县| 墨脱县|