天天看點

vue相關配置檔案詳解及多環境配置

vue相關配置檔案詳解及多環境配置
npm的文檔(裡面包括配置):https://www.axihe.com/api/npm/config/package.html

分類專欄: vue.js 文章标簽: vue.js 前端 webpack
1.package.json
作用:
package.json 檔案其實就是對項目或者子產品包的描述,裡面包含許多元資訊。比如項目名稱,項目版本,項目執行入口檔案,項目貢獻者等等。npm install 指令會根據這個檔案下載下傳所有依賴子產品。

檔案結構如下:

{
  "name": "sop-vue",
  "version": "0.1.0",
  "author": "zhangsan <[email protected]>",
  "description": "sop-vue",
  "keywords":["node.js","javascript"],
  "private": true,
  "bugs":{"url":"http://path/to/bug","email":"[email protected]"},
  "contributors":[{"name":"李四","email":"[email protected]"}],
  "repository": {
                                         "type": "git",
                                         "url": "https://path/to/url"
                    },
  "homepage": "http://github.com/style.css",
  "license":"MIT",
  "dependencies": {
  "bd-font-icons": "^1.1.3",
  "core-js": "^3.6.4",
  "echarts": "^4.7.0",
  "element-ui": "^2.13.1",
  "v-charts": "^1.19.0",
  "vue": "^2.6.11",
  "vue-router": "^3.1.6",
  "vuex": "^3.1.3"
},
  "devDependencies": {
  "@vue/cli-plugin-babel": "^4.3.0",
  "@vue/cli-plugin-eslint": "^4.3.0",
  "@vue/cli-plugin-router": "^4.3.0",
  "@vue/cli-plugin-unit-mocha": "^4.3.0",
  "@vue/cli-plugin-vuex": "^4.3.0",
  "@vue/cli-service": "^4.3.0",
  "@vue/test-utils": "1.0.0-beta.31",
  "babel-core": "^6.26.3",
  "babel-eslint": "^10.1.0",
  "babel-loader": "^7.1.5",
  "babel-preset-env": "^1.7.0",
  "chai": "^4.1.2",
  "eslint": "^6.7.2",
  "eslint-plugin-vue": "^6.2.2",
  "sass": "^1.26.3",
  "sass-loader": "^8.0.2",
  "vue-template-compiler": "^2.6.11"
}
  "scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"test:unit": "vue-cli-service test:unit",
"lint": "vue-cli-service lint"
  },
  "bin": {
  "webpack": "./bin/webpack.js"
  },
  "main": "lib/webpack.js",
  "module": "es/index.js",
  "eslintConfig": {
    "extends": "vue-app"
  },
  "engines" : {
    "node" : ">=0.10.3 <0.12"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "style": [
  "./node_modules/tipso/src/tipso.css"
],
  "files": [
    "lib/",
    "bin/",
    "buildin/",
    "declarations/",
    "hot/",
    "web_modules/",
    "schemas/",
    "SECURITY.md"
  ]
}

檔案參數說明:

選項    說明    必填
name    項目/子產品名稱,長度必須小于等于214個字元,不能以"."(點)或者"_"(下劃線)開頭,不能包含大寫字母    是
version    項目版本    是
author    項目開發者,它的值是你在https://npmjs.org網站的有效賬戶名,遵循“賬戶名<郵件>”的規則    否
description    項目描述,是一個字元串。它可以幫助人們在使用npm search時找到這個包    否
keywords    項目關鍵字,是一個字元串數組。它可以幫助人們在使用npm search時找到這個包    否
private    是否私有,設定為 true 時,npm 拒絕釋出    否
license    軟體授權條款,讓使用者知道他們的使用權利和限制    否
bugs    bug 送出位址    否
contributors    項目貢獻者    否
repository    項目倉庫位址    否
homepage    項目包的官網 URL    否
dependencies    生産環境下,項目運作所需依賴    否
devDependencies    開發環境下,項目所需依賴    否
scripts    執行 npm 腳本指令簡寫,比如 “serve”: “vue-cli-service serve”, 執行 npm run serve 就是運作 “npm vue-cli-service serve”    否
bin    内部指令對應的可執行檔案的路徑    否
main    項目預設執行檔案,比如 require(‘webpack’);就會預設加載 lib 目錄下的 webpack.js 檔案,如果沒有設定,則預設附加元件目跟目錄下的 index.js 檔案    否
module    是以 ES Module(也就是 ES6)子產品化方式進行加載,因為早期沒有 ES6 子產品化方案時,都是遵循 CommonJS 規範,而 CommonJS 規範的包是以 main 的方式表示入口檔案的,為了區分就新增了 module 方式,但是 ES6 子產品化方案效率更高,是以會優先檢視是否有 module 字段,沒有才使用 main 字段    否
eslintConfig    EsLint 檢查檔案配置,自動讀取驗證    否
engines    項目運作的平台    否
browserslist    供浏覽器使用的版本清單    否
style    供浏覽器使用時,樣式檔案所在的位置;樣式檔案打包工具parcelify,通過它知道樣式檔案的打包位置    否
files    被項目包含的檔案名數組    否
這個檔案儲存着項目的時候配置的項目基本資訊,它是個标準的json格式檔案,編寫時要注意格式,重點要關注一下scripts裡面的内容,這裡面包含了項目的一些指令簡寫,在這裡可以配置啟動不同環境的項目的指令。

2.vue.config.js
vue.config.js 是一個可選的配置檔案,如果項目的 (和 package.json 同級的) 根目錄中存在這個檔案,那麼它會被 @vue/cli-service 自動加載。你也可以使用 package.json 中的 vue 字段,但是注意這種寫法需要你嚴格遵照 JSON 的格式來寫。

這個檔案應該導出一個包含了選項的對象:

// vue.config.js
{
  // 選項...
}
4
選項    說明    類型    預設值
publicPath    部署應用包時的基本 URL    String    ‘/’
outputDir    當運作 vue-cli-service build 時生成的生産環境建構檔案的目錄。注意目标目錄在建構之前會被清除 (建構時傳入 --no-clean 可關閉該行為)    String    ‘dist‘
assetsDir    放置生成的靜态資源 (js、css、img、fonts) 的 (相對于 outputDir 的) 目錄。indexPath: 指定生成的 index.html 的輸出路徑 (相對于 outputDir)。也可以是一個絕對路徑    String    ‘‘
filenameHashing    預設情況下,生成的靜态資源在它們的檔案名中包含了 hash 以便更好的控制緩存。然而,這也要求 index 的 HTML 是被 Vue CLI 自動生成的。如果你無法使用 Vue CLI 生成的 index HTML,你可以通過将這個選項設為 false 來關閉檔案名哈希    boolean    true
Pages    在 multi-page(多頁)模式下建構應用。每個“page”應該有一個對應的 JavaScript 入口檔案。其值應該是一個對象,對象的 key 是入口的名字,value 是一個指定了 entry, template, filename, title 和 chunks 的對象 (除了 entry 之外都是可選的),或一個指定其 entry 的字元串    Object    
lintOnSave    是否在儲存的時候使用 `eslint-loader` 進行檢查。 有效的值:`ture` | `false` | `"error"` 當設定為 `"error"` 時,檢查出的錯誤會觸發編譯失敗    Boolean | ‘warning’ | ‘default’ | ‘error’    True
runtimeCompiler    是否使用包含運作時編譯器的 Vue 建構版本。設定為 true 後你就可以在 Vue 元件中使用 template 選項了,但是這會讓你的應用額外增加 10kb 左右    Boolean    False
Crossorigin    設定生成的 HTML 中 link 和 script标簽的 crossorigin 屬性    String    
configureWebpack    如果這個值是一個對象,則會通過 webpack-merge 合并到最終的配置中。如果這個值是一個函數,則會接收被解析的配置作為參數。該函數及可以修改配置并不傳回任何東西,也可以傳回一個被克隆或合并過的配置版本    Object | Function    
chainWebpack    是一個函數,會接收一個基于 webpack-chain 的 ChainableConfig 執行個體。允許對内部的 webpack 配置進行更細粒度的修改    Function    
css.modules    預設情況下,隻有 *.module.[ext] 結尾的檔案才會被視作 CSS Modules 子產品。設定為 true 後你就可以去掉檔案名中的 .module 并将所有的 *.(css|scss|sass|less|styl(us)?) 檔案視為 CSS Modules 子產品    Boolean    True
css.extract    是否将元件中的 CSS 提取至一個獨立的 CSS 檔案中 (而不是動态注入到 JavaScript 中的 inline 代碼)。(Default: 生産環境下是 true,開發環境下是 false)    Boolean | object    True
css.sourceMap    是否為 CSS 開啟 source map。設定為 true 之後可能會影響建構的性能。css.loaderOptions:向 CSS 相關的 loader 傳遞選項    Boolean    False
devServer    所有 webpack-dev-server 的選項都支援。注意:有些值像 host、port 和 https 可能會被指令行參數覆寫。有些值像 publicPath 和 historyApiFallback 不應該被修改,因為它們需要和開發伺服器的 publicPath 同步以保障正常的工作    Object    
devServer.proxy    如果你的前端應用和後端 API 伺服器沒有運作在同一個主機上,你需要在開發環境下将 API 請求代理到 API 伺服器。這個問題可以通過 vue.config.js 中的 devServer.proxy 選項來配置    Strinng | Object    
Parallel    是否為 Babel 或 TypeScript 使用 thread-loader。該選項在系統的 CPU 有多于一個核心時自動啟用,僅作用于生産建構    Boolean    
Pwa    向 PWA 插件傳遞選項    Object    
pluginOptions    這是一個不進行任何 schema 驗證的對象,是以它可以用來傳遞任何第三方插件選項    Object    
下面是個比較完整點的配置執行個體
// Vue.config.js 配置選項
module.exports = {
    // 選項
    //  基本路徑
    publicPath: "./",
    //  建構時的輸出目錄
    outputDir: "dist",
    //  放置靜态資源的目錄
    assetsDir: "static",
    //  html 的輸出路徑
    indexPath: "index.html",
    //檔案名哈希
    filenameHashing: true,
    //用于多頁配置,預設是 undefined
    pages: {
        index: {
            // page 的入口檔案
            entry: 'src/index/main.js',
            // 模闆檔案
            template: 'public/index.html',
            // 在 dist/index.html 的輸出檔案
            filename: 'index.html',
            // 當使用頁面 title 選項時,
            // template 中的 title 标簽需要是 <title><%= htmlWebpackPlugin.options.title %></title>
            title: 'Index Page',
            // 在這個頁面中包含的塊,預設情況下會包含
            // 提取出來的通用 chunk 和 vendor chunk。
            chunks: ['chunk-vendors', 'chunk-common', 'index']
        },
        // 當使用隻有入口的字元串格式時,
        // 模闆檔案預設是 `public/subpage.html`
        // 如果不存在,就回退到 `public/index.html`。
        // 輸出檔案預設是 `subpage.html`。
        subpage: 'src/subpage/main.js'
    },
    //  是否在儲存的時候使用 `eslint-loader` 進行檢查。
    lintOnSave: true,
    //  是否使用帶有浏覽器内編譯器的完整建構版本
    runtimeCompiler: false,
    //  babel-loader 預設會跳過 node_modules 依賴。
    transpileDependencies: [ /* string or regex */ ],
    //  是否為生産環境建構生成 source map?
    productionSourceMap: true,
    //  設定生成的 HTML 中 <link rel="stylesheet"> 和 <script> 标簽的 crossorigin 屬性。
    crossorigin: "",
    //  在生成的 HTML 中的 <link rel="stylesheet"> 和 <script> 标簽上啟用 Subresource Integrity (SRI)。
    integrity: false,
    //  調整内部的 webpack 配置
    configureWebpack: () => {}, //(Object | Function)
    chainWebpack: () => {},
    // 配置 webpack-dev-server 行為。
    devServer: {
        open: process.platform === 'darwin',
        host: '0.0.0.0',
        port: 8080,
        https: false,
        hotOnly: false,
        // 查閱 https://github.com/vuejs/vue-docs-zh-cn/blob/master/vue-cli/cli-service.md#配置代理
        proxy: {
            '/api': {
                target: "http://app.rmsdmedia.com",
                changeOrigin: true,
                secure: false,
                pathRewrite: {
                    "^/api": ""
                }
            },
            '/foo': {
                target: '<other_url>'
            }
        }, // string | Object
        before: app => {}
    },
    // CSS 相關選項
    css: {
        // 将元件内的 CSS 提取到一個單獨的 CSS 檔案 (隻用在生産環境中)
        // 也可以是一個傳遞給 `extract-text-webpack-plugin` 的選項對象
        extract: true,
        // 是否開啟 CSS source map?
        sourceMap: false,
        // 為預處理器的 loader 傳遞自定義選項。比如傳遞給
        // Css-loader 時,使用 `{ Css: { ... } }`。
        loaderOptions: {
            css: {
                // 這裡的選項會傳遞給 css-loader
            },
            postcss: {
                // 這裡的選項會傳遞給 postcss-loader
            }
        },
        // 為所有的 CSS 及其預處理檔案開啟 CSS Modules。
        // 這個選項不會影響 `*.vue` 檔案。
        modules: false
    },
    // 在生産環境下為 Babel 和 TypeScript 使用 `thread-loader`
    // 在多核機器下會預設開啟。
    parallel: require('os').cpus().length > 1,
    // PWA 插件的選項。
    // 查閱 https://github.com/vuejs/vue-docs-zh-cn/blob/master/vue-cli-plugin-pwa/README.md
    pwa: {},
    // 三方插件的選項
    pluginOptions: {
        // ...
    }
}

3.多環境配置
日常項目中我們可能有多個環境,常見的開發、測試和生産,它們的接口位址和執行操作也是不一樣的,是以我們需要配置不同的環境,就拿基本的開發、測試、生産三個環境來說。
首先在根目錄下建立.env.dev、.env.test、.env.prod檔案(開發、測試、生産)

檔案内容:

選項    說明
NODE_ENV    可以設定為其他值,比如"test",但是打包後的目錄結構和"production"不一樣,是以還是設定為"production",通過"VUE_APP_MODE"變量來區分環境
VUE_APP_MODE    線上測試環境
VUE_APP_API_URL    api調用位址
例如:



在main.js中配置接口位址指向配置檔案的位址



修改package.json檔案中scripts中編譯指令即可進行不同環境的配置,–mode後面指向不同的配置檔案.env.dev、.env.test、.env.prod

運作npm run dev即可通路開發環境接口


運作npm run test即可使用測試環境接口

運作npm run prod即可通路生産環境接口


Vue.config.js中可以在configureWebpack中去根據不同環境修改相應的一些配置
例如:

configureWebpack: (config) => {
    if (process.env. VUE_APP_MODE === 'prod') {
        // 為生産環境修改配置...
    }else if(process.env. VUE_APP_MODE === 'test'){
        // 為測試環境修改配置...
    }else {
        // 為開發環境修改配置...
    }
    Object.assign(config, {
        // 開發、測試、生産共同配置
        resolve: {
            alias: {
                '@': path.resolve(__dirname, './src'),
                '@c': path.resolve(__dirname, './src/components'),
                '@p': path.resolve(__dirname, './src/pages')
            } // 别名配置
        }
    })
},

打包同理

"build:dev": "vue-cli-service build --mode dev",
"build:test": "vue-cli-service build --mode test",
"build:prod": "vue-cli-service build --mode prod"
1
運作npm run build:dev即可建構開發環境
運作npm run build:test即可建構測試環境
運作npm run build:prod即可建構生産環境


————————————————
版權聲明:本文為CSDN部落客「是老王吖」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/jdkss/article/details/106140374