日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > vue >内容正文

vue

alias cli3 配置_vue-cli3全面配置详解

發(fā)布時間:2025/3/19 vue 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 alias cli3 配置_vue-cli3全面配置详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

創(chuàng)建項目

配置環(huán)境變量

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

在項目根目錄中新建.env, .env.production,...等文件

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

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

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

NODE_ENV?=?'development'

VUE_APP_BASE_API?=?''

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

NODE_ENV?=?'production'

VUE_APP_BASE_API?=?''

配置vue.config.js

const?IS_PROD?=?['production',?'prod'].includes(process.env.NODE_ENV);

module.exports?=?{

baseUrl:?'./',?//?默認(rèn)'/',部署應(yīng)用包時的基本?URL

outputDir:?process.env.outputDir?||?'dist',?//?'dist',?生產(chǎn)環(huán)境構(gòu)建文件的目錄

assetsDir:?'',??//?相對于outputDir的靜態(tài)資源(js、css、img、fonts)目錄

lintOnSave:?false,

runtimeCompiler:?true,?//?是否使用包含運行時編譯器的?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

}

}

}

}

//在項目中具體的配置

devServer:?{

//webpack?dev?serve工具提供的

//???assetsSubDirectory:?'public',

//???assetsPublicPath:?'/',

proxy:?{

'api':?{?//如果請求api的話?改下面的配置

target:?'http://localhost:8080/',?//轉(zhuǎn)發(fā)端口

ws:?true,?//?是否啟用websockets

changOrigin:?true,

//開啟代理:在本地會創(chuàng)建一個虛擬服務(wù)端,然后發(fā)送請求的數(shù)據(jù),并同時接收請求的數(shù)據(jù),這樣服務(wù)端和服務(wù)端進(jìn)行數(shù)據(jù)的交互就不會有跨域問題

pathRewrite:?{

'^/api'?:?'/mock'

}

}

}

},

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

module.exports?=?{

chainWebpack:?config?=>?{

//?修復(fù)HMR

config.resolve.symlinks(true);

}

}

修復(fù)Lazy loading routes Error: Cyclic dependency https://github.com/vuejs/vue-cli/issues/1669

module.exports?=?{

chainWebpack:?config?=>?{

config.plugin('html').tap(args?=>?{

args[0].chunksSortMode?=?'none';

return?args;

});

}

}

添加別名

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 中,而是在運行時(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

};

開啟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

];

}

}

}

還可以開啟比gzip體驗更好的Zopfli壓縮詳見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提供全局樣式,以及全局變量

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

css中可以使用注入sass變量訪問環(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

};

配置文件上傳OSS

npm?i?--save-dev?webpack-oss

const?AliOssPlugin?=?require('webpack-oss');

module.exports?=?{

configureWebpack:?config?=>?{

if?(IS_PROD)?{

const?plugins?=?[];

//?上傳文件到oss

if?(process.env.ACCESS_KEY_ID?||?process.env.ACCESS_KEY_SECRET?||?process.env.REGION?||?process.env.BUCKET?||?process.env.PREFIX)?{

plugins.push(

new?AliOssPlugin({

accessKeyId:?process.env.ACCESS_KEY_ID,

accessKeySecret:?process.env.ACCESS_KEY_SECRET,

region:?process.env.REGION,

bucket:?process.env.BUCKET,

prefix:?process.env.PREFIX,

exclude:?/.*\.html$/,

enableLog:?true,

ignoreError:?false,

deleteMode:?false,

deleteAll:?false

})

);

}

config.plugins?=?[

...config.plugins,

...plugins

];

}

}

}

完整配置

安裝依賴npm?i?--save-dev?compression-webpack-plugin?babel-plugin-transform-remove-console??@gfx/zopfli?brotli-webpack-plugin

環(huán)境配置

.env

NODE_ENV?=?'development'

VUE_APP_BASE_API?=?'https://demo.cn/api'

.env.production

NODE_ENV?=?'production'

VUE_APP_BASE_API?=?''

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?AliOssPlugin?=?require('webpack-oss');

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:?IS_PROD???process.env.VUE_APP_SRC?||?'/'?:?'./',?//?默認(rèn)'/',部署應(yīng)用包時的基本?URL

outputDir:?process.env.outputDir?||?'dist',?//?'dist',?生產(chǎn)環(huán)境構(gòu)建文件的目錄

assetsDir:?'',??//?相對于outputDir的靜態(tài)資源(js、css、img、fonts)目錄

lintOnSave:?false,

runtimeCompiler:?true,?//?是否使用包含運行時編譯器的?Vue?構(gòu)建版本

productionSourceMap:?false,??//?生產(chǎn)環(huán)境的?source?map

configureWebpack:?config?=>?{

//?cdn引用時配置externals

//?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

})

);

//?上傳文件到oss

//?if?(process.env.ACCESS_KEY_ID?||?process.env.ACCESS_KEY_SECRET?||?process.env.REGION?||?process.env.BUCKET?||?process.env.PREFIX)?{

//?????plugins.push(

//?????????new?AliOssPlugin({

//?????????????accessKeyId:?process.env.ACCESS_KEY_ID,

//?????????????accessKeySecret:?process.env.ACCESS_KEY_SECRET,

//?????????????region:?process.env.REGION,

//?????????????bucket:?process.env.BUCKET,

//?????????????prefix:?process.env.PREFIX,

//?????????????exclude:?/.*\.html$/,

//?????????????enableLog:?true,

//?????????????ignoreError:?false,

//?????????????deleteMode:?false,

//?????????????deleteAll:?false

//?????????})

//?????);

//?}

//?Zopfli壓縮,需要響應(yīng)VC庫?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);

//?修復(fù)Lazy?loading?routes?Error:?Cyclic?dependency??[https://github.com/vuejs/vue-cli/issues/1669]

config.plugin('html').tap(args?=>?{

args[0].chunksSortMode?=?'none';

return?args;

});

//?添加別名

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',

}]);

}

//?多頁面配置,為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)換正則匹配項

//???????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

}

}

}

};

總結(jié)

以上是生活随笔為你收集整理的alias cli3 配置_vue-cli3全面配置详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 99免费精品 | 色妇av | 一区二区中文字幕在线观看 | 亚洲一区二区精品在线观看 | 黄色中文 | 日本一区二区三区在线免费观看 | 神马久久香蕉 | 午夜一区二区三区免费观看 | 香蕉成人在线视频 | 好屌妞视频这里只有精品 | 少妇太紧太爽又黄又硬又爽小说 | 久久av网| 午夜激情影视 | av三级在线播放 | 国产对白刺激视频 | 日本精品视频在线 | 久久久资源 | 91久久精品国产91性色tv | 日韩一区二区三区在线播放 | 成人午夜av在线 | 久久久久久久久国产精品 | 牛牛影视免费观看 | 视频在线看 | 亚洲精品成人a | 粉嫩视频在线观看 | 亚洲国产精品一区二区三区 | 日日噜噜噜 | 麻豆国产尤物av尤物在线观看 | 亚州春色 | 伊人精品久久 | 日韩免费影院 | 成人毛片100免费观看 | 性爱动漫| 国产偷人爽久久久久久老妇app | 蜜芽久久 | 国产黄色一级片视频 | 中文字幕日韩欧美 | 特种兵之深入敌后高清全集免费观看 | 一级黄av | 美女100%无挡 | 国产亚洲精 | 九九热视频这里只有精品 | 免费无遮挡无码永久视频 | chinese hd av| 人人妻人人澡人人爽人人精品 | 爱爱视频欧美 | 九一精品在线 | 久久久午夜精品 | 黄色片网站免费 | 国产馆视频 | 成人激情小视频 | 色哟哟在线免费观看 | 婷婷午夜激情 | 丰满人妻一区二区三区四区53 | 精品国产乱码久久久久久影片 | 一级片久久久久 | 黑人巨大精品欧美黑白配亚洲 | av在线首页 | 在线观看视频免费 | 桃色av| 国产一区二区视频在线 | 亚洲v欧美 | 久久高清| 91理论片 | 草草影院国产第一页 | 久久综合久色欧美综合狠狠 | 成人在线高清视频 | 精品播放 | 日韩欧美精品 | 人人97| 先锋影音一区二区三区 | 日韩亚洲影院 | 丁香六月久久 | 色热热 | 中文字幕在线2021 | 神马久久久久久久 | 久久精品国产网红主播 | 日韩美女视频在线观看 | 欧美一区二区三区婷婷 | 久久久久久久久久久网 | 亚洲在线观看一区二区 | 精品一区二区欧美 | 韩国毛片网站 | 福利网址在线 | 91视频直接看 | 天天综合视频 | 蜜臀av性久久久久av蜜臀妖精 | 国产在线观看免费网站 | 深夜福利av | 久久艹在线 | 天天摸日日干 | 九色蝌蚪91 | 毛片在线免费观看网站 | 自拍一区在线 | 国产亚洲制服 | 欧美日韩激情在线一区二区三区 | 免费视频91蜜桃 | 波多野结衣先锋影音 | 欧美少妇一区二区 |