新聞中心
一、前言

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供耀州網(wǎng)站建設(shè)、耀州做網(wǎng)站、耀州網(wǎng)站設(shè)計(jì)、耀州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、耀州企業(yè)網(wǎng)站模板建站服務(wù),10余年耀州做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
vue-cli是構(gòu)建vue單頁應(yīng)用的腳手架,輸入一串指定的命令行從而自動(dòng)生成vue.js+wepack的項(xiàng)目模板。這其中webpack發(fā)揮了很大的作用,它使得我們的代碼模塊化,引入一些插件幫我們完善功能可以將文件打包壓縮,圖片轉(zhuǎn)base64等。后期對項(xiàng)目的配置使得我們對于腳手架自動(dòng)生成的代碼的理解更為重要,接下來我將基于webpack3.6.0版本結(jié)合文檔將文件各個(gè)擊破,純干料。
重點(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
項(xiàng)目作為一個(gè)大家庭,每個(gè)文件都各司其職。package.json來制定名單,需要哪些npm包來參與到項(xiàng)目中來,npm install命令根據(jù)這個(gè)配置文件增減來管理本地的安裝包。
- {
- //從name到private都是package的配置信息,也就是我們在腳手架搭建中輸入的項(xiàng)目描述
- "name": "shop",//項(xiàng)目名稱:不能以.(點(diǎn))或者_(dá)(下劃線)開頭,不能包含大寫字母,具有明確的的含義與現(xiàn)有項(xiàng)目名字不重復(fù)
- "version": "1.0.0",//項(xiàng)目版本號:遵循“大版本.次要版本.小版本”
- "description": "A Vue.js project",//項(xiàng)目描述
- "author": "qietuniu",//作者名字
- "private": true,//是否私有
- //scripts中的子項(xiàng)即是我們在控制臺運(yùn)行的腳本的縮寫
- "scripts": {
- //①webpack-dev-server:啟動(dòng)了http服務(wù)器,實(shí)現(xiàn)實(shí)時(shí)編譯;
- //inline模式會(huì)在webpack.config.js入口配置中新增webpack-dev-server/client?http://localhost:8080/的入口,使得我們訪問路徑為localhost:8080/index.html(相應(yīng)的還有另外一種模式Iframe);
- //progress:顯示打包的進(jìn)度
- "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
- "start": "npm run dev",//與npm run dev相同,直接運(yùn)行開發(fā)環(huán)境
- "build": "node build/build.js"http://使用node運(yùn)行build文件
- },
- //②dependencies(項(xiàng)目依賴庫):在安裝時(shí)使用--save則寫入到dependencies
- "dependencies": {
- "vue": "^2.5.2",//vue.js
- "vue-router": "^3.0.1"http://vue的路由插件
- },
- //和devDependencies(開發(fā)依賴庫):在安裝時(shí)使用--save-dev將寫入到devDependencies
- "devDependencies": {
- "autoprefixer": "^7.1.2",//autoprefixer作為postcss插件用來解析CSS補(bǔ)充前綴,例如 display: flex會(huì)補(bǔ)充為display:-webkit-box;display: -webkit-flex;display: -ms-flexbox;display: flex。
- //babel:以下幾個(gè)babel開頭的都是針對es6解析的插件。用***標(biāo)準(zhǔn)編寫的 JavaScript 代碼向下編譯成可以在今天隨處可用的版本
- "babel-core": "^6.22.1",//babel的核心,把 js 代碼分析成 ast ,方便各個(gè)插件分析語法進(jìn)行相應(yīng)的處理。
- "babel-helper-vue-jsx-merge-props": "^2.0.3",//預(yù)制babel-template函數(shù),提供給vue,jsx等使用
- "babel-loader": "^7.1.1",//使項(xiàng)目運(yùn)行使用Babel和webpack來傳輸js文件,使用babel-core提供的api進(jìn)行轉(zhuǎn)譯
- "babel-plugin-syntax-jsx": "^6.18.0",//支持jsx
- "babel-plugin-transform-runtime": "^6.22.0",//避免編譯輸出中的重復(fù),直接編譯到build環(huán)境中
- "babel-plugin-transform-vue-jsx": "^3.5.0",//babel轉(zhuǎn)譯過程中使用到的插件,避免重復(fù)
- "babel-preset-env": "^1.3.2",//轉(zhuǎn)為es5,transform階段使用到的插件之一
- "babel-preset-stage-2": "^6.22.0",//ECMAScript第二階段的規(guī)范
- "chalk": "^2.0.1",//用來在命令行輸出不同顏色文字
- "copy-webpack-plugin": "^4.0.1",//拷貝資源和文件
- "css-loader": "^0.28.0",//webpack先用css-loader加載器去解析后綴為css的文件,再使用style-loader生成一個(gè)內(nèi)容為最終解析完的css代碼的style標(biāo)簽,放到head標(biāo)簽里
- "extract-text-webpack-plugin": "^3.0.0",//將一個(gè)以上的包里面的文本提取到單獨(dú)文件中
- "file-loader": "^1.1.4",//③打包壓縮文件,與url-loader用法類似
- "friendly-errors-webpack-plugin": "^1.6.1",//識別某些類別的WebPACK錯(cuò)誤和清理,聚合和優(yōu)先排序,以提供更好的開發(fā)經(jīng)驗(yàn)
- "html-webpack-plugin": "^2.30.1",//簡化了HTML文件的創(chuàng)建,引入了外部資源,創(chuàng)建html的入口文件,可通過此項(xiàng)進(jìn)行多頁面的配置
- "node-notifier": "^5.1.2",//支持使用node發(fā)送跨平臺的本地通知
- "optimize-css-assets-webpack-plugin": "^3.2.0",//壓縮提取出的css,并解決ExtractTextPlugin分離出的js重復(fù)問題(多個(gè)文件引入同一css文件)
- "ora": "^1.2.0",//加載(loading)的插件
- "portfinder": "^1.0.13",//查看進(jìn)程端口
- "postcss-import": "^11.0.0",//可以消耗本地文件、節(jié)點(diǎn)模塊或web_modules
- "postcss-loader": "^2.0.8",//用來兼容css的插件
- "postcss-url": "^7.2.1",//URL上重新定位、內(nèi)聯(lián)或復(fù)制
- "rimraf": "^2.6.0",//節(jié)點(diǎn)的UNIX命令RM—RF,強(qiáng)制刪除文件或者目錄的命令
- "semver": "^5.3.0",//用來對特定的版本號做判斷的
- "shelljs": "^0.7.6",//使用它來消除shell腳本在UNIX上的依賴性,同時(shí)仍然保留其熟悉和強(qiáng)大的命令,即可執(zhí)行Unix系統(tǒng)命令
- "uglifyjs-webpack-plugin": "^1.1.1",//壓縮js文件
- "url-loader": "^0.5.8",//壓縮文件,可將圖片轉(zhuǎn)化為base64
- "vue-loader": "^13.3.0",//VUE單文件組件的WebPACK加載器
- "vue-style-loader": "^3.0.1",//類似于樣式加載程序,您可以在CSS加載器之后將其鏈接,以將CSS動(dòng)態(tài)地注入到文檔中作為樣式標(biāo)簽
- "vue-template-compiler": "^2.5.2",//這個(gè)包可以用來預(yù)編譯VUE模板到渲染函數(shù),以避免運(yùn)行時(shí)編譯開銷和CSP限制
- "webpack": "^3.6.0",//打包工具
- "webpack-bundle-analyzer": "^2.9.0",//可視化webpack輸出文件的大小
- "webpack-dev-server": "^2.9.1",//提供一個(gè)提供實(shí)時(shí)重載的開發(fā)服務(wù)器
- "webpack-merge": "^4.1.0"http://它將數(shù)組和合并對象創(chuàng)建一個(gè)新對象。如果遇到函數(shù),它將執(zhí)行它們,通過算法運(yùn)行結(jié)果,然后再次將返回的值封裝在函數(shù)中
- },
- //engines是引擎,指定node和npm版本
- "engines": {
- "node": ">= 6.0.0",
- "npm": ">= 3.0.0"
- },
- //限制了瀏覽器或者客戶端需要什么版本才可運(yùn)行
- "browserslist": [
- "> 1%",
- "last 2 versions",
- "not ie <= 8"
- ]
- }
注釋:
①、點(diǎn)這里→webpack運(yùn)行時(shí)的配置文檔傳送門
②、devDependencies和dependencies的區(qū)別: devDependencies里面的插件只用于開發(fā)環(huán)境,不用于生產(chǎn)環(huán)境,即輔助作用,打包的時(shí)候需要,打包完成就不需要了。而dependencies是需要發(fā)布到生產(chǎn)環(huán)境的,自始至終都在。比如wepack等只是在開發(fā)中使用的包就寫入到devDependencies,而像vue這種項(xiàng)目全程依賴的包要寫入到devDependencies
點(diǎn)這里→更多安裝包文檔搜索頁傳送門
③、file-loader和url-loader的區(qū)別:以圖片為例,file-loader可對圖片進(jìn)行壓縮,但是還是通過文件路徑進(jìn)行引入,當(dāng)http請求增多時(shí)會(huì)降低頁面性能,而url-loader通過設(shè)定limit參數(shù),小于limit字節(jié)的圖片會(huì)被轉(zhuǎn)成base64的文件,大于limit字節(jié)的將進(jìn)行圖片壓縮的操作??偠灾?,url-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包的一個(gè)配置,在webpack的舊版本可以直接在webpack.config.js中配置,現(xiàn)版本中postcss的文檔示例獨(dú)立出.postcssrc.js,里面寫進(jìn)去需要使用到的插件
- module.exports = {
- "plugins": {
- "postcss-import": {},//①
- "postcss-url": {},//②
- "autoprefixer": {}//③
- }
- }
注釋:
①、點(diǎn)這里→postcss-import文檔傳送門
②、點(diǎn)這里→postcss-url文檔傳送門
③、點(diǎn)這里→autoprefixer文檔傳送門
3、 .babelrc
該文件是es6解析的一個(gè)配置
- {
- //制定轉(zhuǎn)碼的規(guī)則
- "presets": [
- //env是使用babel-preset-env插件將js進(jìn)行轉(zhuǎn)碼成es5,并且設(shè)置不轉(zhuǎn)碼的AMD,COMMONJS的模塊文件,制定瀏覽器的兼容
- ["env", {
- "modules": false,
- "targets": {
- "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
- }
- }],
- "stage-2"
- ],
- "plugins": ["transform-vue-jsx", "transform-runtime"]//①
- }
注釋:
①、點(diǎn)這里→transform-vue-jsx文檔傳送門
點(diǎn)這里→transform-runtime文檔傳送門
4、src內(nèi)文件
我們開發(fā)的代碼都存放在src目錄下,根據(jù)需要我們通常會(huì)再建一些文件夾。比如pages的文件夾,用來存放頁面讓components文件夾專門做好組件的工作;api文件夾,來封裝請求的參數(shù)和方法;store文件夾,使用vuex來作為vue的狀態(tài)管理工具,我也常叫它作前端的數(shù)據(jù)庫等。
①、assets文件:腳手架自動(dòng)回放入一個(gè)圖片在里面作為初始頁面的logo。平常我們使用的時(shí)候會(huì)在里面建立js,css,img,fonts等文件夾,作為靜態(tài)資源調(diào)用
②、components文件夾:用來存放組件,合理地使用組件可以高效地實(shí)現(xiàn)復(fù)用等功能,從而更好地開發(fā)項(xiàng)目。一般情況下比如創(chuàng)建頭部組件的時(shí)候,我們會(huì)新建一個(gè)header的文件夾,然后再新建一個(gè)header.vue的文件夾
③、router文件夾:該文件夾下有一個(gè)叫index.js文件,用于實(shí)現(xiàn)頁面的路由跳轉(zhuǎn),具體使用請點(diǎn)擊→vue-router傳送門
④、App.vue:作為我們的主組件,可通過使用
⑤、main.js:作為我們的入口文件,主要作用是初始化vue實(shí)例并使用需要的插件,小型項(xiàng)目省略router時(shí)可放在該處
注釋:具體vue的用法可查看vue官方中文文檔傳送門
5、其他文件
①、.editorconfig:編輯器的配置文件
②、.gitignore:忽略git提交的一個(gè)文件,配置之后提交時(shí)將不會(huì)加載忽略的文件
③、index.html:頁面入口,經(jīng)過編譯之后的代碼將插入到這來。
④、package.lock.json:鎖定安裝時(shí)的包的版本號,并且需要上傳到git,以保證其他人在npm install時(shí)大家的依賴能保證一致
⑤、README.md:可此填寫項(xiàng)目介紹
⑥、node_modules:根據(jù)package.json安裝時(shí)候生成的的依賴(安裝包)
三、config文件夾
├─config
│ ├─dev.env.js
│ ├─index.js
│ ├─prod.env.js
1、config/dev.env.js
config內(nèi)的文件其實(shí)是服務(wù)于build的,大部分是定義一個(gè)變量export出去。
- 'use strict'//采用嚴(yán)格模式
- const merge = require('webpack-merge')//①
- const prodEnv = require('./prod.env')
- //webpack-merge提供了一個(gè)合并函數(shù),它將數(shù)組和合并對象創(chuàng)建一個(gè)新對象。
- //如果遇到函數(shù),它將執(zhí)行它們,通過算法運(yùn)行結(jié)果,然后再次將返回的值封裝在函數(shù)中.這邊將dev和prod進(jìn)行合并
- module.exports = merge(prodEnv, {
- NODE_ENV: '"development"'
- })
注釋:①、點(diǎn)這里→webpack-merge文檔傳送門
2、config/prod.env.js
當(dāng)開發(fā)是調(diào)取dev.env.js的開發(fā)環(huán)境配置,發(fā)布時(shí)調(diào)用prod.env.js的生產(chǎn)環(huán)境配置
- 'use strict'
- module.exports = {
- NODE_ENV: '"production"'
- }
3、config/index.js
- 'use strict'
- const path = require('path')
- module.exports = {
- dev: {
- // 開發(fā)環(huán)境下面的配置
- assetsSubDirectory: 'static',//子目錄,一般存放css,js,image等文件
- assetsPublicPath: '/',//根目錄
- proxyTable: {},//可利用該屬性解決跨域的問題
- host: 'localhost', // 地址
- port: 8080, //端口號設(shè)置,端口號占用出現(xiàn)問題可在此處修改
- autoOpenBrowser: false,//是否在編譯(輸入命令行npm run dev)后打開http://localhost:8080/頁面,以前配置為true,近些版本改為false,個(gè)人偏向習(xí)慣自動(dòng)打開頁面
- errorOverlay: true,//瀏覽器錯(cuò)誤提示
- notifyOnErrors: true,//跨平臺錯(cuò)誤提示
- poll: false, //使用文件系統(tǒng)(file system)獲取文件改動(dòng)的通知devServer.watchOptions
- devtool: 'cheap-module-eval-source-map',//增加調(diào)試,該屬性為原始源代碼(僅限行)不可在生產(chǎn)環(huán)境中使用
- cacheBusting: true,//使緩存失效
- cssSourceMap: true//代碼壓縮后進(jìn)行調(diào)bug定位將非常困難,于是引入sourcemap記錄壓縮前后的位置信息記錄,當(dāng)產(chǎn)生錯(cuò)誤時(shí)直接定位到未壓縮前的位置,將大大的方便我們調(diào)試
- },
- build: {
- // 生產(chǎn)環(huán)境下面的配置
- index: path.resolve(__dirname, '../dist/index.html'),//index編譯后生成的位置和名字,根據(jù)需要改變后綴,比如index.php
- assetsRoot: path.resolve(__dirname, '../dist'),//編譯后存放生成環(huán)境代碼的位置
- assetsSubDirectory: 'static',//js,css,images存放文件夾名
- assetsPublicPath: '/',//發(fā)布的根目錄,通常本地打包dist后打開文件會(huì)報(bào)錯(cuò),此處修改為./。如果是上線的文件,可根據(jù)文件存放位置進(jìn)行更改路徑
- productionSourceMap: true,
- devtool: '#source-map',//①
- //unit的gzip命令用來壓縮文件,gzip模式下需要壓縮的文件的擴(kuò)展名有js和css
- productionGzip: false,
- productionGzipExtensions: ['js', 'css'],
- bundleAnalyzerReport: process.env.npm_config_report
- }
- }
注釋:①點(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)境的代碼。
- 'use strict'
- require('./check-versions')()//check-versions:調(diào)用檢查版本的文件。加()代表直接調(diào)用該函數(shù)
- process.env.NODE_ENV = 'production'//設(shè)置當(dāng)前是生產(chǎn)環(huán)境
- //下面定義常量引入插件
- const ora = require('ora')//①加載動(dòng)畫
- const rm = require('rimraf')//②刪除文件
- const path = require('path')
- const chalk = require('chalk')//③對文案輸出的一個(gè)彩色設(shè)置
- const webpack = require('webpack')
- const config = require('../config')//默認(rèn)讀取下面的index.js文件
- const webpackConfig = require('./webpack.prod.conf')
- //調(diào)用start的方法實(shí)現(xiàn)加載動(dòng)畫,優(yōu)化用戶體驗(yàn)
- const spinner = ora('building for production...')
- spinner.start()
- //先刪除dist文件再生成新文件,因?yàn)橛袝r(shí)候會(huì)使用hash來命名,刪除整個(gè)文件可避免冗余
- rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
- if (err) throw err
- webpack(webpackConfig, (err, stats) => {
- spinner.stop()
- if (err) throw err
- process.stdout.write(stats.toString({
- colors: true,
- modules: false,
- children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
- chunks: false,
- chunkModules: false
- }) + '\n\n')
- if (stats.hasErrors()) {
- process.exit(1)
- }
- console.log(chalk.cyan(' Build complete.\n'))
- console.log(chalk.yellow(
- ' Tip: built files are meant to be served over an HTTP server.\n' +
- ' Opening index.html over file:// won\'t work.\n'
- ))
- })
- })
注釋:
①、點(diǎn)這里→ora文檔傳送門
②、點(diǎn)這里→chalk文檔傳送門
③、點(diǎn)這里→rimraf文檔傳送門
2、build/check-version.js
該文件用于檢測node和npm的版本,實(shí)現(xiàn)版本依賴
- 'use strict'
- const chalk = require('chalk')
- const semver = require('semver')//①對版本進(jìn)行檢查
- const packageConfig = require('../package.json')
- const shell = require('shelljs')
- function exec (cmd) {
- //返回通過child_process模塊的新建子進(jìn)程,執(zhí)行 Unix 系統(tǒng)命令后轉(zhuǎn)成沒有空格的字符串
- return require('child_process').execSync(cmd).toString().trim()
- }
- const versionRequirements = [
- {
- name: 'node',
- currentVersion: semver.clean(process.version),//使用semver格式化版本
- versionRequirement: packageConfig.engines.node//獲取package.json中設(shè)置的node版本
- }
- ]
- if (shell.which('npm')) {
- versionRequirements.push({
- name: 'npm',
- currentVersion: exec('npm --version'),// 自動(dòng)調(diào)用npm --version命令,并且把參數(shù)返回給exec函數(shù),從而獲取純凈的版本號
- versionRequirement: packageConfig.engines.npm
- })
- }
- module.exports = function () {
- const warnings = []
- for (let i = 0; i < versionRequirements.length; i++) {
- const mod = versionRequirements[i]
- if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
- //上面這個(gè)判斷就是如果版本號不符合package.json文件中指定的版本號,就執(zhí)行下面錯(cuò)誤提示的代碼
- warnings.push(mod.name + ': ' +
- chalk.red(mod.currentVersion) + ' should be ' +
- chalk.green(mod.versionRequirement)
- )
- }
- }
- if (warnings.length) {
- console.log('')
- console.log(chalk.yellow('To use this template, you must update following to modules:'))
- console.log()
- for (let i = 0; i < warnings.length; i++) {
- const warning = warnings[i]
- console.log(' ' + warning)
- }
- console.log()
- process.exit(1)
- }
- }
注釋:
①、點(diǎn)這里→chalk文檔傳送門
點(diǎn)這里→semver文檔傳送門
3、build/utils.js
utils是工具的意思,是一個(gè)用來處理css的文件。
- 'use strict'
- const path = require('path')
- const config = require('../config')
- const ExtractTextPlugin = require('extract-text-webpack-plugin')
- const packageConfig = require('../package.json')
- //導(dǎo)出文件的位置,根據(jù)環(huán)境判斷開發(fā)環(huán)境和生產(chǎn)環(huán)境,為config文件中index.js文件中定義的build.assetsSubDirectory或dev.assetsSubDirectory
- exports.assetsPath = function (_path) {
- const assetsSubDirectory = process.env.NODE_ENV === 'production'
- ? config.build.assetsSubDirectory
- : config.dev.assetsSubDirectory
- //Node.js path 模塊提供了一些用于處理文件路徑的小工具①
- return path.posix.join(assetsSubDirectory, _path)
- }
- exports.cssLoaders = function (options) {
- options = options || {}
- //使用了css-loader和postcssLoader,通過options.usePostCSS屬性來判斷是否使用postcssLoader中壓縮等方法
- const cssLoader = {
- loader: 'css-loader',
- options: {
- sourceMap: options.sourceMap
- }
- }
- const postcssLoader = {
- loader: 'postcss-loader',
- options: {
- sourceMap: options.sourceMap
- }
- }
- function generateLoaders (loader, loaderOptions) {
- const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
- if (loader) {
- loaders.push({
- loader: loader + '-loader',
- //Object.assign是es6語法的淺復(fù)制,后兩者合并后復(fù)制完成賦值
- options: Object.assign({}, loaderOptions, {
- sourceMap: options.sourceMap
- })
- })
- }
- if (options.extract) {
- //ExtractTextPlugin可提取出文本,代表首先使用上面處理的loaders,當(dāng)未能正確引入時(shí)使用vue-style-loader
- return ExtractTextPlugin.extract({
- use: loaders,
- fallback: 'vue-style-loader'
- })
- } else {
- //返回vue-style-loader連接loaders的最終值
- return ['vue-style-loader'].concat(loaders)
- }
- }
- return {
- css: generateLoaders(),//需要css-loader 和 vue-style-loader
- postcss: generateLoaders(),//需要css-loader和postcssLoader 和 vue-style-loader
- less: generateLoaders('less'),//需要less-loader 和 vue-style-loader
- sass: generateLoaders('sass', { indentedSyntax: true }),//需要sass-loader 和 vue-style-loader
- scss: generateLoaders('sass'),//需要sass-loader 和 vue-style-loader
- stylus: generateLoaders('stylus'),//需要stylus-loader 和 vue-style-loader
- styl: generateLoaders('stylus')//需要stylus-loader 和 vue-style-loader
- }
- }
- exports.styleLoaders = function (options) {
- const output = []
- const loaders = exports.cssLoaders(options)
- //將各種css,less,sass等綜合在一起得出結(jié)果輸出output
- for (const extension in loaders) {
- const loader = loaders[extension]
- output.push({
- test: new RegExp('\\.' + extension + '$'),
- use: loader
- })
- }
- return output
- }
- exports.createNotifierCallback = () => {
- //發(fā)送跨平臺通知系統(tǒng)
- const notifier = require('node-notifier')
- return (severity, errors) => {
- if (severity !== 'error') return
- //當(dāng)報(bào)錯(cuò)時(shí)輸出錯(cuò)誤信息的標(biāo)題,錯(cuò)誤信息詳情,副標(biāo)題以及圖標(biāo)
- const error = errors[0]
- const filename = error.file && error.file.split('!').pop()
- notifier.notify({
- title: packageConfig.name,
- message: severity + ': ' + error.name,
- subtitle: filename || '',
- icon: path.join(__dirname, 'logo.png')
- })
- }
- }
注釋:
①、path.posix:提供對路徑方法的POSIX(可移植性操作系統(tǒng)接口)特定實(shí)現(xiàn)的訪問,即可跨平臺,區(qū)別于win32。
path.join:用于連接路徑,會(huì)正確使用當(dāng)前系統(tǒng)的路徑分隔符,Unix系統(tǒng)是"/",Windows系統(tǒng)是""
點(diǎn)擊→path用法傳送門
4、vue-loader.conf.js
該文件的主要作用就是處理.vue文件,解析這個(gè)文件中的每個(gè)語言塊(template、script、style),轉(zhuǎn)換成js可用的js模塊。
- 'use strict'
- const utils = require('./utils')
- const config = require('../config')
- const isProduction = process.env.NODE_ENV === 'production'
- const sourceMapEnabled = isProduction
- ? config.build.productionSourceMap
- : config.dev.cssSourceMap
- //處理項(xiàng)目中的css文件,生產(chǎn)環(huán)境和測試環(huán)境默認(rèn)是打開sourceMap,而extract中的提取樣式到單獨(dú)文件只有在生產(chǎn)環(huán)境中才需要
- module.exports = {
- loaders: utils.cssLoaders({
- sourceMap: sourceMapEnabled,
- extract: isProduction
- }),
- cssSourceMap: sourceMapEnabled,
- cacheBusting: config.dev.cacheBusting,
- // 在模版編譯過程中,編譯器可以將某些屬性,如 src 路徑,轉(zhuǎn)換為require調(diào)用,以便目標(biāo)資源可以由 webpack 處理.
- transformToRequire: {
- video: ['src', 'poster'],
- source: 'src',
- img: 'src',
- image: 'xlink:href'
- }
- }
5、webpack.base.conf.js
webpack.base.conf.js是開發(fā)和生產(chǎn)共同使用提出來的基礎(chǔ)配置文件,主要實(shí)現(xiàn)配制入口,配置輸出環(huán)境,配置模塊resolve和插件等
- 'use strict'
- const path = require('path')
- const utils = require('./utils')
- const config = require('../config')
- const vueLoaderConfig = require('./vue-loader.conf')
- function resolve (dir) {
- //拼接出絕對路徑
- return path.join(__dirname, '..', dir)
- }
- module.exports = {
- //path.join將路徑片段進(jìn)行拼接,而path.resolve將以/開始的路徑片段作為根目錄,在此之前的路徑將會(huì)被丟棄
- //path.join('/a', '/b') // 'a/b',path.resolve('/a', '/b') // '/b'
- context: path.resolve(__dirname, '../'),
- //配置入口,默認(rèn)為單頁面所以只有app一個(gè)入口
- entry: {
- app: './src/main.js'
- },
- //配置出口,默認(rèn)是/dist作為目標(biāo)文件夾的路徑
- output: {
- path: config.build.assetsRoot,//路徑
- filename: '[name].js',//文件名
- publicPath: process.env.NODE_ENV === 'production'
- ? config.build.assetsPublicPath
- : config.dev.assetsPublicPath//公共存放路徑
- },
- resolve: {
- //自動(dòng)的擴(kuò)展后綴,比如一個(gè)js文件,則引用時(shí)書寫可不要寫.js
- extensions: ['.js', '.vue', '.json'],
- //創(chuàng)建路徑的別名,比如增加'components': resolve('src/components')等
- alias: {
- 'vue$': 'vue/dist/vue.esm.js',
- '@': resolve('src'),
- }
- },
- //使用插件配置相應(yīng)文件的處理方法
- module: {
- rules: [
- //使用vue-loader將vue文件轉(zhuǎn)化成js的模塊①
- {
- test: /\.vue$/,
- loader: 'vue-loader',
- options: vueLoaderConfig
- },
- //js文件需要通過babel-loader進(jìn)行編譯成es5文件以及壓縮等操作②
- {
- test: /\.js$/,
- loader: 'babel-loader',
- include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
- },
- //圖片、音像、字體都使用url-loader進(jìn)行處理,超過10000會(huì)編譯成base64③
- {
- tes
網(wǎng)站標(biāo)題:關(guān)于vue-cli腳手架中webpack配置基礎(chǔ)文件詳解
本文地址:http://www.fisionsoft.com.cn/article/cogijpi.html


咨詢
建站咨詢
