vue ui ; 一個ui版界面,用於建立vue項目;
const router = new VueRouter({ base: '/', mode: 'history', //還可設置爲'hash'模式 routes })
// const webpack = require('webpack') module.exports = { lintOnSave: false, // 禁止eslint devServer: { open: true, // 構建完成自動打開瀏覽器 }, configureWebpack: { plugins: [ // 全局配置node_modules中的模塊,使用時無需引入 new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery", "windows.jQuery": "jquery" }) ] }, // webpack 連接 API,用於生成和修改 webapck 配置 chainWebpack: (config) => { // 取消 chunks,每一個頁面只對應一個單獨的 JS / CSS config.optimization.splitChunks({ cacheGroups: {} }); // config // .plugin('webpack-bundle-analyzer') // .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin) }, pluginOptions: { } }
npm run serve
import Home from '../views/Home.vue'
const routes = [ { path: '/', name: 'Home', // component: Home component: () => import(/* webpackChunkName: "home" */ '../views/Home.vue') // webpack的魔法註釋,將拆分出的js命名爲home }, { path: '/about', name: 'About', // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "about" */ '../views/About.vue') } ]
若是在main.js中引入的node_modules包,則會直接打包進app.js,這個逃不掉。css
cnpm i cress-env --save-dev // 更改node環境變量插件
以後在package.json中加入以下三行配置,便可區分本地、測試、線上環境html
"scripts": { "serve": "cross-env NODE_ENV=development vue-cli-service serve", "test": "cross-env NODE_ENV=test vue-cli-service build", "build": "cross-env NODE_ENV=production vue-cli-service build" },
console.log(process.env.NODE_ENV)
// 開發環境地址(npm run serve) const devHost = { // 接口地址域名相關 baseApi: 'https://abc.com', } // 測試環境地址(npm run test) const testHost = { // 接口地址域名相關 baseApi: 'https://abc.com', } // 線上環境地址(npm run build) const proHost = { // 接口地址域名相關 baseApi: 'https://abc1.com', } // 區分環境選擇靜態資源地址 const env = process.env.NODE_ENV let exportConfig = '' if (env === 'production') { exportConfig = proHost } else if (env === 'test') { exportConfig = testHost } else { exportConfig = devHost } export default exportConfig
https://cli.vuejs.org/zh/config/#css-sourcemapvue
const webpack = require('webpack') const processEnv = process.env.VUE_APP_ENV; // 區分環境(值:production、development、test) const isPro = processEnv === 'production'; // 判斷production環境 const outputDir = 'dist'; // 輸出文件目錄(默認dist) const assetsDir = ''; // 配置放置生成的靜態資源 (js、css、img、fonts) 的 (相對於 outputDir 的) 目錄 // 區分環境選擇cdn地址 let publicPath = '' // 靜態資源引用路徑 let fontPublicPath = '' // 字體圖標引用的cdn路徑 let imgPublicPath = '' // css引用圖片的cdn路徑(c2c/static/img) if (processEnv === 'production') { publicPath = 'https://abc.com/c2c/shop' // 正式環境靜態資源css、js等cdn路徑 fontPublicPath = `https://abc.com/c2c/shop/${assetsDir ? assetsDir + '/' : '/'}fonts` // 正式環境字體圖標引用的cdn路徑 imgPublicPath = `https://abc.com/c2c/shop/${assetsDir ? assetsDir + '/' : '/'}/img` // 正式環境css引用圖片的cdn路徑 } else if (processEnv === 'test') { // publicPath = './' // 正式環境靜態資源css、js等cdn路徑 publicPath = 'https://bcd.com/c2c/shop/dist' // 測試環境靜態資源css、js等cdn路徑 fontPublicPath = '' imgPublicPath = '' } else { publicPath = '/' fontPublicPath = '' imgPublicPath = '' } const devServerHost = 'localhost'; const devServerPort = '8080'; // 端口號 const devServerOpen = true; // 熱啓動後自動打開瀏覽器 module.exports = { // 配置生成dist裏面static的cdn資源路徑(測試環境爲./,正式環境走cdn路徑) publicPath: publicPath, // 輸出文件目錄(默認dist) outputDir, // 配置放置生成的靜態資源 (js、css、img、fonts) 的 (相對於 outputDir 的) 目錄 assetsDir, devServer: { host: devServerHost, port: devServerPort, open: devServerOpen, // 構建完成自動打開瀏覽器 // eslint檢測影響代碼編譯,註釋調不會影響代碼編譯 // overlay: { // warnings: true, // errors: true // } }, lintOnSave: processEnv === 'development' ? true : false, // 開發環境開啓eslint,測試和線上編輯代碼禁止eslint // webpack 配置,鍵值對象時會合並配置,爲方法時會改寫配置 configureWebpack: config => { // 擴展資源,不將部分資源js等打入包內引用cdn資源 let externals = { // 'swiper': 'Swiper', }; config.externals = externals; //警告 webpack 的性能提示 config.performance = { hints: isPro ? 'warning' : false, // 本地開發不顯示警告 // 入口起點的最大致積 maxEntrypointSize: 512000, // 500kib // 生成文件的最大致積 maxAssetSize: 307200, // 300kib // 只給出 js 文件的性能提示 assetFilter(assetFilename) { return assetFilename.endsWith('.js'); } }; }, // webpack 連接 API,用於生成和修改 webapck 配置 chainWebpack: (config) => { // 取消 chunks,每一個頁面只對應一個單獨的 JS / CSS config.optimization.splitChunks({ cacheGroups: {} }); // 全局配置node_modules中的模塊,使用時無需引入 config.plugin('provide').use(webpack.ProvidePlugin, [{ $: "n-zepto", Zepto: "n-zepto", "window.Zepto": "n-zepto" }]); config.module .rule('images') .use('url-loader') .loader('url-loader') .tap(options => Object.assign(options, { limit: 10240, // 小於10k,壓縮圖片 => base64 // limit: 3000, publicPath: imgPublicPath, name: `[name].[hash:8].[ext]` })) // 設置fonts字體文件引用的路徑 config.module .rule('fonts') .test(/\.(woff2?|eot|ttf|otf)(\?.*)?$/i) .use('url-loader') .loader('file-loader') .tap(options => Object.assign(options, { limit: 5000, publicPath: fontPublicPath, name: '[name].[hash:8].[ext]' })) // npm run report;打印app.js的模塊報告,查看各個模塊; if (processEnv === 'report') { config .plugin('webpack-bundle-analyzer') .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin) } }, // css配置處理 css: { // 是否使用css分離插件 ExtractTextPlugin;true:頁面css獨立分割,false:頁面css同一打包; extract: true, // 開啓 CSS source maps(默認false)線上關閉,測試和本地開啓 sourceMap: isPro ? false : true, // css預設器配置項 loaderOptions: { sass: { // sass的公共方法和變量,須要預編譯; prependData: ` @import "@/assets/css/global.scss"; @import "@/assets/css/func.scss"; ` }, postcss: { plugins: [ // 瀏覽器自動加前綴 require('autoprefixer')({ overrideBrowserslist: [ "Android 4.0", "iOS 7", "Chrome > 31", "ff > 31", "ie >= 8" ] }), ] } }, /** 啓用 CSS modules for all css / pre-processor files. 引入第三方ui庫和若是在js中引用了css的話,必須設置爲true,由於若是設置爲false的話,會把這些經過js引入的css啓動css modules,會將第三方ui的css類名後面加上哈希值,會出問題。 參考文檔(vue-cli官網解釋):https://cli.vuejs.org/zh/config/#css-requiremoduleextension 和 https://cli.vuejs.org/zh/guide/css.html#css-modules **/ requireModuleExtension: true }, // 構建時開啓多進程處理 babel 編譯 parallel: require('os').cpus().length > 1, pwa: { iconPaths: { favicon32: 'favicon.ico', favicon16: 'favicon.ico', appleTouchIcon: 'favicon.ico', maskIcon: 'favicon.ico', msTileImage: 'favicon.ico' }, }, // 第三方插件配置 pluginOptions: { // ... } }