日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
關(guān)于vue-cli腳手架中webpack配置基礎(chǔ)文件詳解

一、前言

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供耀州網(wǎng)站建設(shè)、耀州做網(wǎng)站、耀州網(wǎng)站設(shè)計、耀州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、耀州企業(yè)網(wǎng)站模板建站服務(wù),10余年耀州做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

vue-cli是構(gòu)建vue單頁應(yīng)用的腳手架,輸入一串指定的命令行從而自動生成vue.js+wepack的項目模板。這其中webpack發(fā)揮了很大的作用,它使得我們的代碼模塊化,引入一些插件幫我們完善功能可以將文件打包壓縮,圖片轉(zhuǎn)base64等。后期對項目的配置使得我們對于腳手架自動生成的代碼的理解更為重要,接下來我將基于webpack3.6.0版本結(jié)合文檔將文件各個擊破,純干料。

重點(diǎn)章節(jié)點(diǎn)擊查看:package.json;config/index.js;webpack.base.conf.js;webpack.dev.conf.js;webpack.prod.conf.js

二、主體結(jié)構(gòu)

├─build

├─config

├─dist

├─node_modules

├─src

│ ├─assets

│ ├─components

│ ├─router

│ ├─App.vue

│ ├─main.js

├─static

├─.babelrc

├─.editorconfig

├─.gitignore

├─.postcssrc.js

├─index.html

├─package-lock.json

├─package.json

└─README.md

1、 package.json

項目作為一個大家庭,每個文件都各司其職。package.json來制定名單,需要哪些npm包來參與到項目中來,npm install命令根據(jù)這個配置文件增減來管理本地的安裝包。

 
 
 
 
  1. //從name到private都是package的配置信息,也就是我們在腳手架搭建中輸入的項目描述 
  2.   "name": "shop",//項目名稱:不能以.(點(diǎn))或者_(dá)(下劃線)開頭,不能包含大寫字母,具有明確的的含義與現(xiàn)有項目名字不重復(fù) 
  3.   "version": "1.0.0",//項目版本號:遵循“大版本.次要版本.小版本” 
  4.   "description": "A Vue.js project",//項目描述 
  5.   "author": "qietuniu",//作者名字 
  6.   "private": true,//是否私有 
  7.   //scripts中的子項即是我們在控制臺運(yùn)行的腳本的縮寫 
  8.   "scripts": { 
  9.    //①webpack-dev-server:啟動了http服務(wù)器,實(shí)現(xiàn)實(shí)時編譯; 
  10.    //inline模式會在webpack.config.js入口配置中新增webpack-dev-server/client?http://localhost:8080/的入口,使得我們訪問路徑為localhost:8080/index.html(相應(yīng)的還有另外一種模式Iframe); 
  11.    //progress:顯示打包的進(jìn)度 
  12.     "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",   
  13.     "start": "npm run dev",//與npm run dev相同,直接運(yùn)行開發(fā)環(huán)境 
  14.     "build": "node build/build.js"http://使用node運(yùn)行build文件 
  15.   },
  16.   //②dependencies(項目依賴庫):在安裝時使用--save則寫入到dependencies 
  17.   "dependencies": { 
  18.     "vue": "^2.5.2",//vue.js 
  19.     "vue-router": "^3.0.1"http://vue的路由插件 
  20.   }, 
  21.   //和devDependencies(開發(fā)依賴庫):在安裝時使用--save-dev將寫入到devDependencies 
  22.   "devDependencies": { 
  23.     "autoprefixer": "^7.1.2",//autoprefixer作為postcss插件用來解析CSS補(bǔ)充前綴,例如 display: flex會補(bǔ)充為display:-webkit-box;display: -webkit-flex;display: -ms-flexbox;display: flex。 
  24.     //babel:以下幾個babel開頭的都是針對es6解析的插件。用***標(biāo)準(zhǔn)編寫的 JavaScript 代碼向下編譯成可以在今天隨處可用的版本 
  25.     "babel-core": "^6.22.1",//babel的核心,把 js 代碼分析成 ast ,方便各個插件分析語法進(jìn)行相應(yīng)的處理。
  26.      "babel-helper-vue-jsx-merge-props": "^2.0.3",//預(yù)制babel-template函數(shù),提供給vue,jsx等使用 
  27.     "babel-loader": "^7.1.1",//使項目運(yùn)行使用Babel和webpack來傳輸js文件,使用babel-core提供的api進(jìn)行轉(zhuǎn)譯 
  28.     "babel-plugin-syntax-jsx": "^6.18.0",//支持jsx 
  29.     "babel-plugin-transform-runtime": "^6.22.0",//避免編譯輸出中的重復(fù),直接編譯到build環(huán)境中 
  30.     "babel-plugin-transform-vue-jsx": "^3.5.0",//babel轉(zhuǎn)譯過程中使用到的插件,避免重復(fù) 
  31.     "babel-preset-env": "^1.3.2",//轉(zhuǎn)為es5,transform階段使用到的插件之一 
  32.     "babel-preset-stage-2": "^6.22.0",//ECMAScript第二階段的規(guī)范 
  33.     "chalk": "^2.0.1",//用來在命令行輸出不同顏色文字 
  34.     "copy-webpack-plugin": "^4.0.1",//拷貝資源和文件 
  35.     "css-loader": "^0.28.0",//webpack先用css-loader加載器去解析后綴為css的文件,再使用style-loader生成一個內(nèi)容為最終解析完的css代碼的style標(biāo)簽,放到head標(biāo)簽里 
  36.     "extract-text-webpack-plugin": "^3.0.0",//將一個以上的包里面的文本提取到單獨(dú)文件中 
  37.     "file-loader": "^1.1.4",//③打包壓縮文件,與url-loader用法類似 
  38.     "friendly-errors-webpack-plugin": "^1.6.1",//識別某些類別的WebPACK錯誤和清理,聚合和優(yōu)先排序,以提供更好的開發(fā)經(jīng)驗 
  39.     "html-webpack-plugin": "^2.30.1",//簡化了HTML文件的創(chuàng)建,引入了外部資源,創(chuàng)建html的入口文件,可通過此項進(jìn)行多頁面的配置
  40.     "node-notifier": "^5.1.2",//支持使用node發(fā)送跨平臺的本地通知 
  41.     "optimize-css-assets-webpack-plugin": "^3.2.0",//壓縮提取出的css,并解決ExtractTextPlugin分離出的js重復(fù)問題(多個文件引入同一css文件) 
  42.     "ora": "^1.2.0",//加載(loading)的插件 
  43.     "portfinder": "^1.0.13",//查看進(jìn)程端口 
  44.     "postcss-import": "^11.0.0",//可以消耗本地文件、節(jié)點(diǎn)模塊或web_modules 
  45.     "postcss-loader": "^2.0.8",//用來兼容css的插件 
  46.     "postcss-url": "^7.2.1",//URL上重新定位、內(nèi)聯(lián)或復(fù)制 
  47.     "rimraf": "^2.6.0",//節(jié)點(diǎn)的UNIX命令RM—RF,強(qiáng)制刪除文件或者目錄的命令 
  48.     "semver": "^5.3.0",//用來對特定的版本號做判斷的 
  49.     "shelljs": "^0.7.6",//使用它來消除shell腳本在UNIX上的依賴性,同時仍然保留其熟悉和強(qiáng)大的命令,即可執(zhí)行Unix系統(tǒng)命令 
  50.     "uglifyjs-webpack-plugin": "^1.1.1",//壓縮js文件 
  51.     "url-loader": "^0.5.8",//壓縮文件,可將圖片轉(zhuǎn)化為base64 
  52.     "vue-loader": "^13.3.0",//VUE單文件組件的WebPACK加載器 
  53.     "vue-style-loader": "^3.0.1",//類似于樣式加載程序,您可以在CSS加載器之后將其鏈接,以將CSS動態(tài)地注入到文檔中作為樣式標(biāo)簽 
  54.     "vue-template-compiler": "^2.5.2",//這個包可以用來預(yù)編譯VUE模板到渲染函數(shù),以避免運(yùn)行時編譯開銷和CSP限制 
  55.     "webpack": "^3.6.0",//打包工具 
  56.     "webpack-bundle-analyzer": "^2.9.0",//可視化webpack輸出文件的大小 
  57.     "webpack-dev-server": "^2.9.1",//提供一個提供實(shí)時重載的開發(fā)服務(wù)器 
  58.     "webpack-merge": "^4.1.0"http://它將數(shù)組和合并對象創(chuàng)建一個新對象。如果遇到函數(shù),它將執(zhí)行它們,通過算法運(yùn)行結(jié)果,然后再次將返回的值封裝在函數(shù)中 
  59.   },
  60.   //engines是引擎,指定node和npm版本 
  61.   "engines": { 
  62.     "node": ">= 6.0.0", 
  63.     "npm": ">= 3.0.0" 
  64.   }, 
  65.   //限制了瀏覽器或者客戶端需要什么版本才可運(yùn)行 
  66.   "browserslist": [ 
  67.     "> 1%", 
  68.     "last 2 versions", 
  69.     "not ie <= 8" 
  70.   ] 
  71. }

注釋:

①、點(diǎn)這里→webpack運(yùn)行時的配置文檔傳送門

②、devDependencies和dependencies的區(qū)別: devDependencies里面的插件只用于開發(fā)環(huán)境,不用于生產(chǎn)環(huán)境,即輔助作用,打包的時候需要,打包完成就不需要了。而dependencies是需要發(fā)布到生產(chǎn)環(huán)境的,自始至終都在。比如wepack等只是在開發(fā)中使用的包就寫入到devDependencies,而像vue這種項目全程依賴的包要寫入到devDependencies

點(diǎn)這里→更多安裝包文檔搜索頁傳送門

③、file-loader和url-loader的區(qū)別:以圖片為例,file-loader可對圖片進(jìn)行壓縮,但是還是通過文件路徑進(jìn)行引入,當(dāng)http請求增多時會降低頁面性能,而url-loader通過設(shè)定limit參數(shù),小于limit字節(jié)的圖片會被轉(zhuǎn)成base64的文件,大于limit字節(jié)的將進(jìn)行圖片壓縮的操作??偠灾瑄rl-loader是file-loader的上層封裝。

點(diǎn)這里→file-loader 和 url-loader詳解

點(diǎn)這里→file-loader文檔傳送門

點(diǎn)這里→url-loader文檔傳送門

2、.postcssrc.js

.postcssrc.js文件其實(shí)是postcss-loader包的一個配置,在webpack的舊版本可以直接在webpack.config.js中配置,現(xiàn)版本中postcss的文檔示例獨(dú)立出.postcssrc.js,里面寫進(jìn)去需要使用到的插件

 
 
 
 
  1. module.exports = { 
  2.   "plugins": { 
  3.     "postcss-import": {},//① 
  4.     "postcss-url": {},//② 
  5.     "autoprefixer": {}//③ 
  6.   } 
  7. }

注釋:

①、點(diǎn)這里→postcss-import文檔傳送門

②、點(diǎn)這里→postcss-url文檔傳送門

③、點(diǎn)這里→autoprefixer文檔傳送門

3、 .babelrc

該文件是es6解析的一個配置

 
 
 
 
  1. //制定轉(zhuǎn)碼的規(guī)則 
  2.   "presets": [ 
  3.   //env是使用babel-preset-env插件將js進(jìn)行轉(zhuǎn)碼成es5,并且設(shè)置不轉(zhuǎn)碼的AMD,COMMONJS的模塊文件,制定瀏覽器的兼容 
  4.     ["env", { 
  5.       "modules": false, 
  6.       "targets": { 
  7.         "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 
  8.       } 
  9.     }], 
  10.     "stage-2" 
  11.   ],   
  12.   "plugins": ["transform-vue-jsx", "transform-runtime"]//① 
  13. }

注釋:

①、點(diǎn)這里→transform-vue-jsx文檔傳送門

點(diǎn)這里→transform-runtime文檔傳送門

4、src內(nèi)文件

我們開發(fā)的代碼都存放在src目錄下,根據(jù)需要我們通常會再建一些文件夾。比如pages的文件夾,用來存放頁面讓components文件夾專門做好組件的工作;api文件夾,來封裝請求的參數(shù)和方法;store文件夾,使用vuex來作為vue的狀態(tài)管理工具,我也常叫它作前端的數(shù)據(jù)庫等。

①、assets文件:腳手架自動回放入一個圖片在里面作為初始頁面的logo。平常我們使用的時候會在里面建立js,css,img,fonts等文件夾,作為靜態(tài)資源調(diào)用

②、components文件夾:用來存放組件,合理地使用組件可以高效地實(shí)現(xiàn)復(fù)用等功能,從而更好地開發(fā)項目。一般情況下比如創(chuàng)建頭部組件的時候,我們會新建一個header的文件夾,然后再新建一個header.vue的文件夾

③、router文件夾:該文件夾下有一個叫index.js文件,用于實(shí)現(xiàn)頁面的路由跳轉(zhuǎn),具體使用請點(diǎn)擊→vue-router傳送門

④、App.vue:作為我們的主組件,可通過使用開放入口讓其他的頁面組件得以顯示。

⑤、main.js:作為我們的入口文件,主要作用是初始化vue實(shí)例并使用需要的插件,小型項目省略router時可放在該處

注釋:具體vue的用法可查看vue官方中文文檔傳送門

5、其他文件

①、.editorconfig:編輯器的配置文件

②、.gitignore:忽略git提交的一個文件,配置之后提交時將不會加載忽略的文件

③、index.html:頁面入口,經(jīng)過編譯之后的代碼將插入到這來。

④、package.lock.json:鎖定安裝時的包的版本號,并且需要上傳到git,以保證其他人在npm install時大家的依賴能保證一致

⑤、README.md:可此填寫項目介紹

⑥、node_modules:根據(jù)package.json安裝時候生成的的依賴(安裝包)

三、config文件夾

├─config

│ ├─dev.env.js

│ ├─index.js

│ ├─prod.env.js

1、config/dev.env.js

config內(nèi)的文件其實(shí)是服務(wù)于build的,大部分是定義一個變量export出去。

 
 
 
 
  1. 'use strict'//采用嚴(yán)格模式 
  2. const merge = require('webpack-merge')//① 
  3. const prodEnv = require('./prod.env') 
  4. //webpack-merge提供了一個合并函數(shù),它將數(shù)組和合并對象創(chuàng)建一個新對象。 
  5. //如果遇到函數(shù),它將執(zhí)行它們,通過算法運(yùn)行結(jié)果,然后再次將返回的值封裝在函數(shù)中.這邊將dev和prod進(jìn)行合并 
  6. module.exports = merge(prodEnv, { 
  7.   NODE_ENV: '"development"' 
  8. })

注釋:①、點(diǎn)這里→webpack-merge文檔傳送門

2、config/prod.env.js

當(dāng)開發(fā)是調(diào)取dev.env.js的開發(fā)環(huán)境配置,發(fā)布時調(diào)用prod.env.js的生產(chǎn)環(huán)境配置

 
 
 
 
  1. 'use strict' 
  2. module.exports = { 
  3.   NODE_ENV: '"production"' 
  4. }

3、config/index.js

 
 
 
 
  1. 'use strict' 
  2. const path = require('path') 
  3. module.exports = { 
  4.   dev: { 
  5.     // 開發(fā)環(huán)境下面的配置 
  6.     assetsSubDirectory: 'static',//子目錄,一般存放css,js,image等文件 
  7.     assetsPublicPath: '/',//根目錄 
  8.     proxyTable: {},//可利用該屬性解決跨域的問題 
  9.     host: 'localhost', // 地址 
  10.     port: 8080, //端口號設(shè)置,端口號占用出現(xiàn)問題可在此處修改 
  11.     autoOpenBrowser: false,//是否在編譯(輸入命令行npm run dev)后打開http://localhost:8080/頁面,以前配置為true,近些版本改為false,個人偏向習(xí)慣自動打開頁面 
  12.     errorOverlay: true,//瀏覽器錯誤提示 
  13.     notifyOnErrors: true,//跨平臺錯誤提示 
  14.     poll: false, //使用文件系統(tǒng)(file system)獲取文件改動的通知devServer.watchOptions 
  15.     devtool: 'cheap-module-eval-source-map',//增加調(diào)試,該屬性為原始源代碼(僅限行)不可在生產(chǎn)環(huán)境中使用 
  16.     cacheBusting: true,//使緩存失效 
  17.     cssSourceMap: true//代碼壓縮后進(jìn)行調(diào)bug定位將非常困難,于是引入sourcemap記錄壓縮前后的位置信息記錄,當(dāng)產(chǎn)生錯誤時直接定位到未壓縮前的位置,將大大的方便我們調(diào)試 
  18.   }, 
  19.   build: { 
  20.   // 生產(chǎn)環(huán)境下面的配置 
  21.     index: path.resolve(__dirname, '../dist/index.html'),//index編譯后生成的位置和名字,根據(jù)需要改變后綴,比如index.php 
  22.     assetsRoot: path.resolve(__dirname, '../dist'),//編譯后存放生成環(huán)境代碼的位置 
  23.     assetsSubDirectory: 'static',//js,css,images存放文件夾名 
  24.     assetsPublicPath: '/',//發(fā)布的根目錄,通常本地打包dist后打開文件會報錯,此處修改為./。如果是上線的文件,可根據(jù)文件存放位置進(jìn)行更改路徑 
  25.     productionSourceMap: true, 
  26.     devtool: '#source-map',//① 
  27.     //unit的gzip命令用來壓縮文件,gzip模式下需要壓縮的文件的擴(kuò)展名有js和css 
  28.     productionGzip: false, 
  29.     productionGzipExtensions: ['js', 'css'], 
  30.     bundleAnalyzerReport: process.env.npm_config_report 
  31.   } 
  32. }

注釋:①點(diǎn)擊→devtool文檔傳送門

四、build文件夾

├─build

│ ├─build.js

│ ├─check-versions.js

│ ├─utils.js

│ ├─vue-loader.conf.js

│ ├─webpack.base.conf.js

│ ├─webpack.dev.conf.js

│ ├─webpack.prod.conf.js

1、build/build.js

該文件作用,即構(gòu)建生產(chǎn)版本。package.json中的scripts的build就是node build/build.js,輸入命令行npm run build對該文件進(jìn)行編譯生成生產(chǎn)環(huán)境的代碼。

 
 
 
 
  1. 'use strict' 
  2. require('./check-versions')()//check-versions:調(diào)用檢查版本的文件。加()代表直接調(diào)用該函數(shù) 
  3. process.env.NODE_ENV = 'production'//設(shè)置當(dāng)前是生產(chǎn)環(huán)境 
  4. //下面定義常量引入插件 
  5. const ora = require('ora')//①加載動畫 
  6. const rm = require('rimraf')//②刪除文件 
  7. const path = require('path') 
  8. const chalk = require('chalk')//③對文案輸出的一個彩色設(shè)置 
  9. const webpack = require('webpack') 
  10. const config = require('../config')//默認(rèn)讀取下面的index.js文件 
  11. const webpackConfig = require('./webpack.prod.conf') 
  12. //調(diào)用start的方法實(shí)現(xiàn)加載動畫,優(yōu)化用戶體驗 
  13. const spinner = ora('building for production...') 
  14. spinner.start()
  15. //先刪除dist文件再生成新文件,因為有時候會使用hash來命名,刪除整個文件可避免冗余 
  16. rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 
  17.   if (err) throw err 
  18.   webpack(webpackConfig, (err, stats) => { 
  19.     spinner.stop() 
  20.     if (err) throw err 
  21.     process.stdout.write(stats.toString({ 
  22.       colors: true, 
  23.       modules: false, 
  24.       children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. 
  25.       chunks: false, 
  26.       chunkModules: false 
  27.     }) + '\n\n') 
  28.     if (stats.hasErrors()) { 
  29.       process.exit(1) 
  30.     } 
  31.     console.log(chalk.cyan('  Build complete.\n')) 
  32.     console.log(chalk.yellow( 
  33.       '  Tip: built files are meant to be served over an HTTP server.\n' + 
  34.       '  Opening index.html over file:// won\'t work.\n' 
  35.     )) 
  36.   }) 
  37. })

注釋:

①、點(diǎn)這里→ora文檔傳送門

②、點(diǎn)這里→chalk文檔傳送門

③、點(diǎn)這里→rimraf文檔傳送門

2、build/check-version.js

該文件用于檢測node和npm的版本,實(shí)現(xiàn)版本依賴

 
 
 
 
  1. 'use strict' 
  2. const chalk = require('chalk') 
  3. const semver = require('semver')//①對版本進(jìn)行檢查 
  4. const packageConfig = require('../package.json')
  5. const shell = require('shelljs')
  6. function exec (cmd) { 
  7. //返回通過child_process模塊的新建子進(jìn)程,執(zhí)行 Unix 系統(tǒng)命令后轉(zhuǎn)成沒有空格的字符串 
  8.   return require('child_process').execSync(cmd).toString().trim() 
  9. }
  10. const versionRequirements = [ 
  11.   { 
  12.     name: 'node', 
  13.     currentVersion: semver.clean(process.version),//使用semver格式化版本 
  14.     versionRequirement: packageConfig.engines.node//獲取package.json中設(shè)置的node版本 
  15.   } 
  16. ]  
  17. if (shell.which('npm')) { 
  18.   versionRequirements.push({ 
  19.     name: 'npm', 
  20.     currentVersion: exec('npm --version'),// 自動調(diào)用npm --version命令,并且把參數(shù)返回給exec函數(shù),從而獲取純凈的版本號 
  21.     versionRequirement: packageConfig.engines.npm 
  22.   }) 
  23. module.exports = function () { 
  24.   const warnings = [] 
  25.   for (let i = 0; i < versionRequirements.length; i++) { 
  26.     const mod = versionRequirements[i] 
  27.     if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 
  28.     //上面這個判斷就是如果版本號不符合package.json文件中指定的版本號,就執(zhí)行下面錯誤提示的代碼 
  29.       warnings.push(mod.name + ': ' + 
  30.         chalk.red(mod.currentVersion) + ' should be ' + 
  31.         chalk.green(mod.versionRequirement) 
  32.       ) 
  33.     } 
  34.   }  
  35.   if (warnings.length) { 
  36.     console.log('') 
  37.     console.log(chalk.yellow('To use this template, you must update following to modules:')) 
  38.     console.log() 
  39.     for (let i = 0; i < warnings.length; i++) { 
  40.       const warning = warnings[i] 
  41.       console.log('  ' + warning) 
  42.     } 
  43.     console.log()
  44.     process.exit(1) 
  45.   } 
  46. }

注釋:

①、點(diǎn)這里→chalk文檔傳送門

點(diǎn)這里→semver文檔傳送門

3、build/utils.js

utils是工具的意思,是一個用來處理css的文件。

 
 
 
 
  1. 'use strict' 
  2. const path = require('path')
  3. const config = require('../config') 
  4. const ExtractTextPlugin = require('extract-text-webpack-plugin') 
  5. const packageConfig = require('../package.json') 
  6. //導(dǎo)出文件的位置,根據(jù)環(huán)境判斷開發(fā)環(huán)境和生產(chǎn)環(huán)境,為config文件中index.js文件中定義的build.assetsSubDirectory或dev.assetsSubDirectory 
  7. exports.assetsPath = function (_path) { 
  8.   const assetsSubDirectory = process.env.NODE_ENV === 'production' 
  9.     ? config.build.assetsSubDirectory 
  10.     : config.dev.assetsSubDirectory 
  11. //Node.js path 模塊提供了一些用于處理文件路徑的小工具① 
  12.   return path.posix.join(assetsSubDirectory, _path) 
  13. }
  14. exports.cssLoaders = function (options) { 
  15.   options = options || {} 
  16. //使用了css-loader和postcssLoader,通過options.usePostCSS屬性來判斷是否使用postcssLoader中壓縮等方法 
  17.   const cssLoader = { 
  18.     loader: 'css-loader', 
  19.     options: { 
  20.       sourceMap: options.sourceMap 
  21.     } 
  22.   }
  23.   const postcssLoader = { 
  24.     loader: 'postcss-loader', 
  25.     options: { 
  26.       sourceMap: options.sourceMap 
  27.     } 
  28.   } 
  29.   function generateLoaders (loader, loaderOptions) { 
  30.     const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] 
  31.     if (loader) { 
  32.       loaders.push({ 
  33.         loader: loader + '-loader', 
  34.         //Object.assign是es6語法的淺復(fù)制,后兩者合并后復(fù)制完成賦值 
  35.         options: Object.assign({}, loaderOptions, { 
  36.           sourceMap: options.sourceMap 
  37.         }) 
  38.       }) 
  39.     }     
  40.     if (options.extract) { 
  41.     //ExtractTextPlugin可提取出文本,代表首先使用上面處理的loaders,當(dāng)未能正確引入時使用vue-style-loader 
  42.       return ExtractTextPlugin.extract({ 
  43.         use: loaders, 
  44.         fallback: 'vue-style-loader' 
  45.       }) 
  46.     } else { 
  47.     //返回vue-style-loader連接loaders的最終值 
  48.       return ['vue-style-loader'].concat(loaders) 
  49.     } 
  50.   } 
  51.   return { 
  52.     css: generateLoaders(),//需要css-loader 和 vue-style-loader 
  53.     postcss: generateLoaders(),//需要css-loader和postcssLoader  和 vue-style-loader 
  54.     less: generateLoaders('less'),//需要less-loader 和 vue-style-loader 
  55.     sass: generateLoaders('sass', { indentedSyntax: true }),//需要sass-loader 和 vue-style-loader 
  56.     scss: generateLoaders('sass'),//需要sass-loader 和 vue-style-loader 
  57.     stylus: generateLoaders('stylus'),//需要stylus-loader 和 vue-style-loader 
  58.     styl: generateLoaders('stylus')//需要stylus-loader 和 vue-style-loader 
  59.   }
  60. }
  61. exports.styleLoaders = function (options) { 
  62.   const output = [] 
  63.   const loaders = exports.cssLoaders(options) 
  64.     //將各種css,less,sass等綜合在一起得出結(jié)果輸出output 
  65.   for (const extension in loaders) { 
  66.     const loader = loaders[extension] 
  67.     output.push({ 
  68.       test: new RegExp('\\.' + extension + '$'), 
  69.       use: loader 
  70.     }) 
  71.   } 
  72.   return output 
  73. }  
  74. exports.createNotifierCallback = () => { 
  75. //發(fā)送跨平臺通知系統(tǒng) 
  76.   const notifier = require('node-notifier') 
  77.   return (severity, errors) => { 
  78.     if (severity !== 'error') return 
  79. //當(dāng)報錯時輸出錯誤信息的標(biāo)題,錯誤信息詳情,副標(biāo)題以及圖標(biāo) 
  80.     const error = errors[0] 
  81.     const filename = error.file && error.file.split('!').pop() 
  82.     notifier.notify({ 
  83.       title: packageConfig.name, 
  84.       message: severity + ': ' + error.name, 
  85.       subtitle: filename || '', 
  86.       icon: path.join(__dirname, 'logo.png') 
  87.     }) 
  88.   } 
  89. }

注釋:

①、path.posix:提供對路徑方法的POSIX(可移植性操作系統(tǒng)接口)特定實(shí)現(xiàn)的訪問,即可跨平臺,區(qū)別于win32。

path.join:用于連接路徑,會正確使用當(dāng)前系統(tǒng)的路徑分隔符,Unix系統(tǒng)是"/",Windows系統(tǒng)是""

點(diǎn)擊→path用法傳送門

4、vue-loader.conf.js

該文件的主要作用就是處理.vue文件,解析這個文件中的每個語言塊(template、script、style),轉(zhuǎn)換成js可用的js模塊。

 
 
 
 
  1. 'use strict' 
  2. const utils = require('./utils') 
  3. const config = require('../config') 
  4. const isProduction = process.env.NODE_ENV === 'production' 
  5. const sourceMapEnabled = isProduction 
  6.   ? config.build.productionSourceMap 
  7.   : config.dev.cssSourceMap 
  8. //處理項目中的css文件,生產(chǎn)環(huán)境和測試環(huán)境默認(rèn)是打開sourceMap,而extract中的提取樣式到單獨(dú)文件只有在生產(chǎn)環(huán)境中才需要 
  9. module.exports = { 
  10.   loaders: utils.cssLoaders({ 
  11.     sourceMap: sourceMapEnabled, 
  12.     extract: isProduction 
  13.   }), 
  14.   cssSourceMap: sourceMapEnabled,
  15.   cacheBusting: config.dev.cacheBusting,
  16.   // 在模版編譯過程中,編譯器可以將某些屬性,如 src 路徑,轉(zhuǎn)換為require調(diào)用,以便目標(biāo)資源可以由 webpack 處理. 
  17.   transformToRequire: { 
  18.     video: ['src', 'poster'], 
  19.     source: 'src', 
  20.     img: 'src', 
  21.     image: 'xlink:href' 
  22.   } 
  23. }

5、webpack.base.conf.js

webpack.base.conf.js是開發(fā)和生產(chǎn)共同使用提出來的基礎(chǔ)配置文件,主要實(shí)現(xiàn)配制入口,配置輸出環(huán)境,配置模塊resolve和插件等

 
 
 
 
  1. 'use strict' 
  2. const path = require('path') 
  3. const utils = require('./utils') 
  4. const config = require('../config') 
  5. const vueLoaderConfig = require('./vue-loader.conf') 
  6. function resolve (dir) { 
  7. //拼接出絕對路徑 
  8.   return path.join(__dirname, '..', dir) 
  9. module.exports = { 
  10. //path.join將路徑片段進(jìn)行拼接,而path.resolve將以/開始的路徑片段作為根目錄,在此之前的路徑將會被丟棄 
  11. //path.join('/a', '/b') // 'a/b',path.resolve('/a', '/b') // '/b' 
  12.   context: path.resolve(__dirname, '../'), 
  13.   //配置入口,默認(rèn)為單頁面所以只有app一個入口 
  14.   entry: { 
  15.     app: './src/main.js' 
  16.   }, 
  17.   //配置出口,默認(rèn)是/dist作為目標(biāo)文件夾的路徑 
  18.   output: { 
  19.     path: config.build.assetsRoot,//路徑 
  20.     filename: '[name].js',//文件名 
  21.     publicPath: process.env.NODE_ENV === 'production' 
  22.       ? config.build.assetsPublicPath 
  23.       : config.dev.assetsPublicPath//公共存放路徑 
  24.   }, 
  25.   resolve: { 
  26.   //自動的擴(kuò)展后綴,比如一個js文件,則引用時書寫可不要寫.js 
  27.     extensions: ['.js', '.vue', '.json'], 
  28.     //創(chuàng)建路徑的別名,比如增加'components': resolve('src/components')等 
  29.     alias: { 
  30.       'vue$': 'vue/dist/vue.esm.js', 
  31.       '@': resolve('src'), 
  32.     } 
  33.   }, 
  34.   //使用插件配置相應(yīng)文件的處理方法 
  35.   module: { 
  36.     rules: [ 
  37.     //使用vue-loader將vue文件轉(zhuǎn)化成js的模塊① 
  38.       { 
  39.         test: /\.vue$/, 
  40.         loader: 'vue-loader', 
  41.         options: vueLoaderConfig 
  42.       }, 
  43.       //js文件需要通過babel-loader進(jìn)行編譯成es5文件以及壓縮等操作② 
  44.       { 
  45.         test: /\.js$/, 
  46.         loader: 'babel-loader', 
  47.         include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] 
  48.       },
  49.       //圖片、音像、字體都使用url-loader進(jìn)行處理,超過10000會編譯成base64③ 
  50.       { 
  51.         tes
    本文標(biāo)題:關(guān)于vue-cli腳手架中webpack配置基礎(chǔ)文件詳解
    轉(zhuǎn)載注明:http://www.5511xx.com/article/cogijpi.html