1. 程式人生 > >vue-cli腳手架每行註釋--摘抄

vue-cli腳手架每行註釋--摘抄

pub loader || url地址 make push eve ext posix

技術分享圖片

.babelrc文件

{

// 此項指明,轉碼的規則

"presets": [

// env項是借助插件babel-preset-env,下面這個配置說的是babel對es6,es7,es8進行轉碼,並且設置amd,commonjs這樣的模塊化文件,不進行轉碼

["env", { "modules": false }],

// 下面這個是不同階段出現的es語法,包含不同的轉碼插件

"stage-2"

],

// 下面這個選項是引用插件來處理代碼的轉換,transform-runtime用來處理全局函數和優化babel編譯

"plugins": ["transform-runtime"],

// 下面指的是在生成的文件中,不產生註釋

"comments": false,

// 下面這段是在特定的環境中所執行的轉碼規則,當環境變量是下面的test就會覆蓋上面的設置

"env": {

// test 是提前設置的環境變量,如果沒有設置BABEL_ENV則使用NODE_ENV,如果都沒有設置默認就是development

"test": {

"presets": ["env", "stage-2"],

// instanbul是一個用來測試轉碼後代碼的工具

"plugins": ["istanbul"]

}

}

}

vue-cli build目錄中的 utils.js 配置文件

此配置文件是vue開發環境的wepack相關配置文件,主要用來處理css-loader和vue-style-loader

// 引入nodejs路徑模塊

var path = require(‘path‘)

// 引入config目錄下的index.js配置文件

var config = require(‘../config‘)

// 引入extract-text-webpack-plugin插件,用來將css提取到單獨的css文件中

// 詳情請看(1)

var ExtractTextPlugin = require(‘extract-text-webpack-plugin‘)

// exports其實就是一個對象,用來導出方法的最終還是使用module.exports,此處導出assetsPath

exports.assetsPath = function (_path) {

// 如果是生產環境assetsSubDirectory就是‘static‘,否則還是‘static‘,

var assetsSubDirectory = process.env.NODE_ENV === ‘production‘

? config.build.assetsSubDirectory

: config.dev.assetsSubDirectory

// path.join和path.posix.join的區別就是,前者返回的是完整的路徑,後者返回的是完整路徑的相對根路徑

// 也就是說path.join的路徑是C:a/a/b/xiangmu/b,那麽path.posix.join就是b

return path.posix.join(assetsSubDirectory, _path)

// 所以這個方法的作用就是返回一個幹凈的相對根路徑

}

// 下面是導出cssLoaders的相關配置

exports.cssLoaders = function (options) {

// options如果沒值就是空對象

options = options || {}

// cssLoader的基本配置

var cssLoader = {

loader: ‘css-loader‘,

options: {

// options是用來傳遞參數給loader的

// minimize表示壓縮,如果是生產環境就壓縮css代碼

minimize: process.env.NODE_ENV === ‘production‘,

// 是否開啟cssmap,默認是false

sourceMap: options.sourceMap

}

}

// generate loader string to be used with extract text plugin

function generateLoaders (loader, loaderOptions) {

// 將上面的基礎cssLoader配置放在一個數組裏面

var loaders = [cssLoader]

// 如果該函數傳遞了單獨的loader就加到這個loaders數組裏面,這個loader可能是less,sass之類的

if (loader) {

loaders.push({

// 加載對應的loader

loader: loader + ‘-loader‘,

// Object.assign是es6的方法,主要用來合並對象的,淺拷貝

options: Object.assign({}, loaderOptions, {

sourceMap: options.sourceMap

})

})

}

// Extract CSS when that option is specified

// (which is the case during production build)

// 註意這個extract是自定義的屬性,可以定義在options裏面,主要作用就是當配置為true就把文件單獨提取,false表示不單獨提取,這個可以在使用的時候單獨配置,瞬間覺得vue作者好牛逼

if (options.extract) {

return ExtractTextPlugin.extract({

use: loaders,

fallback: ‘vue-style-loader‘

})

} else {

return [‘vue-style-loader‘].concat(loaders)

}

// 上面這段代碼就是用來返回最終讀取和導入loader,來處理對應類型的文件

}

// https://vue-loader.vuejs.org/en/configurations/extract-css.html

return {

css: generateLoaders(), // css對應 vue-style-loader 和 css-loader

postcss: generateLoaders(), // postcss對應 vue-style-loader 和 css-loader

less: generateLoaders(‘less‘), // less對應 vue-style-loader 和 less-loader

sass: generateLoaders(‘sass‘, { indentedSyntax: true }), // sass對應 vue-style-loader 和 sass-loader

scss: generateLoaders(‘sass‘), // scss對應 vue-style-loader 和 sass-loader

stylus: generateLoaders(‘stylus‘), // stylus對應 vue-style-loader 和 stylus-loader

styl: generateLoaders(‘stylus‘) // styl對應 vue-style-loader 和 styl-loader

}

}

// Generate loaders for standalone style files (outside of .vue)

// 下面這個主要處理import這種方式導入的文件類型的打包,上面的exports.cssLoaders是為這一步服務的

exports.styleLoaders = function (options) {

var output = []

// 下面就是生成的各種css文件的loader對象

var loaders = exports.cssLoaders(options)

for (var extension in loaders) {

// 把每一種文件的laoder都提取出來

var loader = loaders[extension]

output.push({

// 把最終的結果都push到output數組中,大事搞定

test: new RegExp(‘\\.‘ + extension + ‘$‘),

use: loader

})

}

return output

}

vue-cli腳手架config目錄下index.js配置文件

此配置文件是用來定義開發環境和生產環境中所需要的參數

// see http://vuejs-templates.github.io/webpack for documentation.

// path是node.js的路徑模塊,用來處理路徑統一的問題

var path = require(‘path‘)

module.exports = {

// 下面是build也就是生產編譯環境下的一些配置

build: {

// 導入prod.env.js配置文件,只要用來指定當前環境,詳細見(1)

env: require(‘./prod.env‘),

// 下面是相對路徑的拼接,假如當前跟目錄是config,那麽下面配置的index屬性的屬性值就是dist/index.html

index: path.resolve(__dirname, ‘../dist/index.html‘),

// 下面定義的是靜態資源的根目錄 也就是dist目錄

assetsRoot: path.resolve(__dirname, ‘../dist‘),

// 下面定義的是靜態資源根目錄的子目錄static,也就是dist目錄下面的static

assetsSubDirectory: ‘static‘,

// 下面定義的是靜態資源的公開路徑,也就是真正的引用路徑

assetsPublicPath: ‘/‘,

// 下面定義是否生成生產環境的sourcmap,sourcmap是用來debug編譯後文件的,通過映射到編譯前文件來實現

productionSourceMap: true,

// Gzip off by default as many popular static hosts such as

// Surge or Netlify already gzip all static assets for you.

// Before setting to `true`, make sure to:

// npm install --save-dev compression-webpack-plugin

// 下面是是否在生產環境中壓縮代碼,如果要壓縮必須安裝compression-webpack-plugin

productionGzip: false,

// 下面定義要壓縮哪些類型的文件

productionGzipExtensions: [‘js‘, ‘css‘],

// Run the build command with an extra argument to

// View the bundle analyzer report after build finishes:

// `npm run build --report`

// Set to `true` or `false` to always turn it on or off

// 下面是用來開啟編譯完成後的報告,可以通過設置值為true和false來開啟或關閉

// 下面的process.env.npm_config_report表示定義的一個npm_config_report環境變量,可以自行設置

bundleAnalyzerReport: process.env.npm_config_report

},

dev: {

// 引入當前目錄下的dev.env.js,用來指明開發環境,詳見(2)

env: require(‘./dev.env‘),

// 下面是dev-server的端口號,可以自行更改

port: 8080,

// 下面表示是否自定代開瀏覽器

autoOpenBrowser: true,

assetsSubDirectory: ‘static‘,

assetsPublicPath: ‘/‘,

// 下面是代理表,作用是用來,建一個虛擬api服務器用來代理本機的請求,只能用於開發模式

// 詳見(3)

proxyTable: {},

// CSS Sourcemaps off by default because relative paths are "buggy"

// with this option, according to the CSS-Loader README

// (https://github.com/webpack/css-loader#sourcemaps)

// In our experience, they generally work as expected,

// just be aware of this issue when enabling this option.

// 是否生成css,map文件,上面這段英文就是說使用這個cssmap可能存在問題,但是按照經驗,問題不大,可以使用

// 給人覺得沒必要用這個,css出了問題,直接控制臺不就完事了

cssSourceMap: false

}

}

註釋

(1)下面是prod.env.js的配置內容

module.exports = {

// 作用很明顯,就是導出一個對象,NODE_ENV是一個環境變量,指定production環境

NODE_ENV: ‘"production"‘

}

(2)下面是dev.env.js的配置內容

// 首先引入的是webpack的merge插件,該插件是用來合並對象,也就是配置文件用的,相同的選項會被覆蓋,至於這裏為什麽多次一舉,可能另有他圖吧

var merge = require(‘webpack-merge‘)

// 導入prod.env.js配置文件

var prodEnv = require(‘./prod.env‘)

// 將兩個配置對象合並,最終結果是 NODE_ENV: ‘"development"‘

module.exports = merge(prodEnv, {

NODE_ENV: ‘"development"‘

})

(3)下面是proxyTable的一般用法

vue-cli使用這個功能是借助http-proxy-middleware插件,一般解決跨域請求api

proxyTable: {

‘/list‘: {

target: ‘http://api.xxxxxxxx.com‘, -> 目標url地址

changeOrigin: true, -> 指示是否跨域

pathRewrite: {

‘^/list‘: ‘/list‘ -> 可以使用 /list 等價於 api.xxxxxxxx.com/list

}

}

}

vue-cli腳手架每行註釋--摘抄