欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue-cli3全面配置詳解

 更新時(shí)間:2018年11月14日 15:01:46   作者:staven  
這篇文章主要介紹了vue-cli3全面配置詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 配置vue全局方法的兩種方式實(shí)例

    配置vue全局方法的兩種方式實(shí)例

    vue項(xiàng)目中有一些方法需要在多個(gè)頁(yè)面調(diào)用,但為了避免在每個(gè)頁(yè)面都import進(jìn)來(lái),可以把方法加到原型上去,這樣在每個(gè)組件中都能使用了,下面這篇文章主要給大家介紹了關(guān)于配置vue全局方法的兩種方式,需要的朋友可以參考下
    2021-09-09
  • vue獲取后臺(tái)json字符串方式

    vue獲取后臺(tái)json字符串方式

    這篇文章主要介紹了vue獲取后臺(tái)json字符串方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • el-date-picker設(shè)置日期默認(rèn)值兩種方法(當(dāng)月月初至月末)

    el-date-picker設(shè)置日期默認(rèn)值兩種方法(當(dāng)月月初至月末)

    這篇文章主要給大家介紹了關(guān)于el-date-picker設(shè)置日期默認(rèn)值(當(dāng)月月初至月末)的相關(guān)資料,文中通過(guò)代碼示例將解決的辦法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • webpack+vue-cil 中proxyTable配置接口地址代理操作

    webpack+vue-cil 中proxyTable配置接口地址代理操作

    這篇文章主要介紹了webpack+vue-cil 中proxyTable配置接口地址代理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Nuxt使用Vuex的方法示例

    Nuxt使用Vuex的方法示例

    這篇文章主要介紹了Nuxt使用Vuex的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 解決vue的 v-for 循環(huán)中圖片加載路徑問(wèn)題

    解決vue的 v-for 循環(huán)中圖片加載路徑問(wèn)題

    今天小編就為大家分享一篇解決vue的 v-for 循環(huán)中圖片加載路徑問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • 命令行CLI一鍵生成各種煩人的lint配置實(shí)例

    命令行CLI一鍵生成各種煩人的lint配置實(shí)例

    這篇文章主要為大家介紹了命令行CLI一鍵生成各種煩人的lint配置實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 詳解Vue使用 vue-cli 搭建項(xiàng)目

    詳解Vue使用 vue-cli 搭建項(xiàng)目

    本篇文章主要介紹了詳解Vue使用 vue-cli 搭建項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • 基于Vue實(shí)現(xiàn)文件拖拽上傳功能

    基于Vue實(shí)現(xiàn)文件拖拽上傳功能

    文件拖拽上傳功能現(xiàn)在已經(jīng)隨處可見(jiàn),大家應(yīng)該都用過(guò)了吧,那么它具體是怎么實(shí)現(xiàn)的大家有去了解過(guò)嗎,今天我們一起來(lái)實(shí)現(xiàn)一下這個(gè)功能,并封裝一個(gè)拖拽上傳組件吧
    2024-03-03
  • 關(guān)于vue中@click.native.prevent的說(shuō)明

    關(guān)于vue中@click.native.prevent的說(shuō)明

    這篇文章主要介紹了關(guān)于vue中@click.native.prevent的說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論