這篇文章主要講解了“vue-cli目錄結(jié)構(gòu)詳細講解”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“vue-cli目錄結(jié)構(gòu)詳細講解”吧!
在康樂等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需制作網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,康樂網(wǎng)站建設(shè)費用合理。
一個vue-cli的項目結(jié)構(gòu)如下:
目錄
結(jié)構(gòu)預覽
├─build // 保存一些webpack的初始化配置,項目構(gòu)建 │ ├─build.js // 生產(chǎn)環(huán)境構(gòu)建 │ ├─check-version.js // 檢查npm、node版本 │ ├─vue-loader.conf.js // webpack loader配置 │ ├─webpack.base.conf.js// webpack基礎(chǔ)配置 │ ├─webpack.dev.conf.js // 開發(fā)環(huán)境配置,構(gòu)建本地開發(fā)服務(wù)器 │ ├─webpack.prod.conf.js// 生產(chǎn)環(huán)境的配置 │ ├─config // config文件夾保存一些項目初始化的配置 │ ├─dev.env.js // 開發(fā)環(huán)境的配置 │ ├─index.js // 項目一些配置變量 │ ├─prod.env.js // 生產(chǎn)環(huán)境的配置 │ ├─dist // 打包后的項目 ├─node_modules // 依賴包 │ ├─src // 源碼目錄 │ ├─assets // 靜態(tài)文件目錄 │ ├─components // 組件文件 │ ├─router // 路由 │ ├─App.vue // 是項目入口文件 │ ├─main.js // 是項目的核心文件,入口 ├─static // 靜態(tài)資源目錄 ├─.babelrc // Babel的配置文件 ├─.editorconfig // 代碼規(guī)范配置文件 ├─.gitignore // git忽略配置文件 ├─.postcssrc.js // postcss插件配置文件 ├─index.html // 頁面入口文件 ├─package-lock.json // 項目包管控文件 ├─package.json // 項目配置 └─README.md // 項目說明書
結(jié)構(gòu)解析
build
dev-server.js
首先來看執(zhí)行”npm run dev”時候最先執(zhí)行的build/dev-server.js文件。該文件主要完成下面幾件事情:
檢查node和npm的版本、引入相關(guān)插件和配置
webpack對源碼進行編譯打包并返回compiler對象
創(chuàng)建express服務(wù)器
配置開發(fā)中間件(webpack-dev-middleware)和+ 熱重載中間件(webpack-hot-middleware)
掛載代理服務(wù)和中間件
配置靜態(tài)資源
啟動服務(wù)器監(jiān)聽特定端口(8080)
自動打開瀏覽器并打開特定網(wǎng)址(localhost:8080)
說明: express服務(wù)器提供靜態(tài)文件服務(wù),不過它還使用了http-proxy-middleware,一個http請求代理的中間件。前端開發(fā)過程中需要使用到后臺的API的話,可以通過配置proxyTable來將相應的后臺請求代理到專用的API服務(wù)器。
// 檢查NodeJS和npm的版本 require('./check-versions')() // 獲取基本配置 var config = require('../config') // 如果Node的環(huán)境變量中沒有設(shè)置當前的環(huán)境(NODE_ENV),則使用config中的dev環(huán)境配置作為當前的環(huán)境 if (!process.env.NODE_ENV) { process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV) } // opn是一個可以調(diào)用默認軟件打開網(wǎng)址、圖片、文件等內(nèi)容的插件 // 這里用它來調(diào)用默認瀏覽器打開dev-server監(jiān)聽的端口,例如:localhost:8080 var opn = require('opn') var path = require('path') var express = require('express') var webpack = require('webpack') // http-proxy-middleware是一個express中間件,用于將http請求代理到其他服務(wù)器 // 例:localhost:8080/api/xxx --> localhost:3000/api/xxx // 這里使用該插件可以將前端開發(fā)中涉及到的請求代理到提供服務(wù)的后臺服務(wù)器上,方便與服務(wù)器對接 var proxyMiddleware = require('http-proxy-middleware') // 開發(fā)環(huán)境下的webpack配置 var webpackConfig = require('./webpack.dev.conf') // dev-server 監(jiān)聽的端口,如果沒有在命令行傳入端口號,則使用config.dev.port設(shè)置的端口,例如8080 var port = process.env.PORT || config.dev.port // 用于判斷是否要自動打開瀏覽器的布爾變量,當配置文件中沒有設(shè)置自動打開瀏覽器的時候其值為 false var autoOpenBrowser = !!config.dev.autoOpenBrowser // HTTP代理表,指定規(guī)則,將某些API請求代理到相應的服務(wù)器 var proxyTable = config.dev.proxyTable // 創(chuàng)建express服務(wù)器 var app = express() // webpack根據(jù)配置開始編譯打包源碼并返回compiler對象 var compiler = webpack(webpackConfig) // webpack-dev-middleware將webpack編譯打包后得到的產(chǎn)品文件存放在內(nèi)存中而沒有寫進磁盤 // 將這個中間件掛到express上使用之后即可提供這些編譯后的產(chǎn)品文件服務(wù) var devMiddleware = require('webpack-dev-middleware')(compiler, { publicPath: webpackConfig.output.publicPath, // 設(shè)置訪問路徑為webpack配置中的output里面所對應的路徑 quiet: true // 設(shè)置為true,使其不要在控制臺輸出日志 }) // webpack-hot-middleware,用于實現(xiàn)熱重載功能的中間件 var hotMiddleware = require('webpack-hot-middleware')(compiler, { log: false, // 關(guān)閉控制臺的日志輸出 heartbeat: 2000 // 發(fā)送心跳包的頻率 }) // webpack(重新)編譯打包完成后并將js、css等文件inject到html文件之后,通過熱重載中間件強制頁面刷新 compiler.plugin('compilation', function (compilation) { compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { hotMiddleware.publish({ action: 'reload' }) cb() }) }) // 根據(jù) proxyTable 中的代理請求配置來設(shè)置express服務(wù)器的http代理規(guī)則 Object.keys(proxyTable).forEach(function (context) { var options = proxyTable[context] // 格式化options,例如將'www.example.com'變成{ target: 'www.example.com' } if (typeof options === 'string') { options = { target: options } } app.use(proxyMiddleware(options.filter || context, options)) }) // handle fallback for HTML5 history API // 重定向不存在的URL,用于支持SPA(單頁應用) // 例如使用vue-router并開啟了history模式 app.use(require('connect-history-api-fallback')()) // serve webpack bundle output // 掛載webpack-dev-middleware中間件,提供webpack編譯打包后的產(chǎn)品文件服務(wù) app.use(devMiddleware) // enable hot-reload and state-preserving // compilation error display // 掛載熱重載中間件 app.use(hotMiddleware) // serve pure static assets // 提供static文件夾上的靜態(tài)文件服務(wù) var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) app.use(staticPath, express.static('./static')) // 訪問鏈接 var uri = 'http://localhost:' + port // 創(chuàng)建promise,在應用服務(wù)啟動之后resolve // 便于外部文件require了這個dev-server之后的代碼編寫 var _resolve var readyPromise = new Promise(resolve => { _resolve = resolve }) console.log('> Starting dev server...') // webpack-dev-middleware等待webpack完成所有編譯打包之后輸出提示語到控制臺,表明服務(wù)正式啟動 // 服務(wù)正式啟動才自動打開瀏覽器進入頁面 devMiddleware.waitUntilValid(() => { console.log('> Listening at ' + uri + '\n') // when env is testing, don't need open it if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') { opn(uri) } _resolve() }) // 啟動express服務(wù)器并監(jiān)聽相應的端口 var server = app.listen(port) // 暴露本模塊的功能給外部使用,例如下面這種用法 // var devServer = require('./build/dev-server') // devServer.ready.then(() => {...}) // if (...) { devServer.close() } module.exports = { ready: readyPromise, close: () => { server.close() } }
webpack.base.conf.js
從代碼中看到,dev-server使用的webpack配置來自build/webpack.dev.conf.js文件(測試環(huán)境下使用的是build/webpack.prod.conf.js,這里暫時不考慮測試環(huán)境)。而build/webpack.dev.conf.js中又引用了webpack.base.conf.js,所以這里我先分析webpack.base.conf.js。
webpack.base.conf.js主要完成了下面這些事情:
配置webpack編譯入口
配置webpack輸出路徑和命名規(guī)則
配置模塊resolve規(guī)則
配置不同類型模塊的處理規(guī)則
說明: 這個配置里面只配置了.js、.vue、圖片、字體等幾類文件的處理規(guī)則,如果需要處理其他文件可以在module.rules里面另行配置。
var path = require('path') var fs = require('fs') var utils = require('./utils') var config = require('../config') var vueLoaderConfig = require('./vue-loader.conf') // 獲取絕對路徑 function resolve (dir) { return path.join(__dirname, '..', dir) } module.exports = { // webpack入口文件 entry: { app: './src/main.js' }, // webpack輸出路徑和命名規(guī)則 output: { // webpack輸出的目標文件夾路徑(例如:/dist) path: config.build.assetsRoot, // webpack輸出bundle文件命名格式 filename: '[name].js', // webpack編譯輸出的發(fā)布路徑(例如'//cdn.xxx.com/app/') publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath }, // 模塊resolve的規(guī)則 resolve: { extensions: ['.js', '.vue', '.json'], // 別名,方便引用模塊,例如有了別名之后, // import Vue from 'vue/dist/vue.common.js'可以寫成 import Vue from 'vue' alias: { 'vue$': 'vue/dist/vue.esm.js', '@': resolve('src'), }, symlinks: false }, // 不同類型模塊的處理規(guī)則 module: { rules: [ {// 對src和test文件夾下的.js和.vue文件使用eslint-loader進行代碼規(guī)范檢查 test: /\.(js|vue)$/, loader: 'eslint-loader', enforce: 'pre', include: [resolve('src'), resolve('test')], options: { formatter: require('eslint-friendly-formatter') } }, {// 對所有.vue文件使用vue-loader進行編譯 test: /\.vue$/, loader: 'vue-loader', options: vueLoaderConfig }, {// 對src和test文件夾下的.js文件使用babel-loader將es6+的代碼轉(zhuǎn)成es5 test: /\.js$/, loader: 'babel-loader', include: [resolve('src'), resolve('test')] }, {// 對圖片資源文件使用url-loader test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { // 小于10K的圖片轉(zhuǎn)成base64編碼的dataURL字符串寫到代碼中 limit: 10000, // 其他的圖片轉(zhuǎn)移到靜態(tài)資源文件夾 name: utils.assetsPath('img/[name].[hash:7].[ext]') } }, {// 對多媒體資源文件使用url-loader test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, loader: 'url-loader', options: { // 小于10K的資源轉(zhuǎn)成base64編碼的dataURL字符串寫到代碼中 limit: 10000, // 其他的資源轉(zhuǎn)移到靜態(tài)資源文件夾 name: utils.assetsPath('media/[name].[hash:7].[ext]') } }, {// 對字體資源文件使用url-loader test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url-loader', options: { // 小于10K的資源轉(zhuǎn)成base64編碼的dataURL字符串寫到代碼中 limit: 10000, // 其他的資源轉(zhuǎn)移到靜態(tài)資源文件夾 name: utils.assetsPath('fonts/[name].[hash:7].[ext]') } } ] } }
webpack.dev.conf.js
接下來看webpack.dev.conf.js,這里面在webpack.base.conf的基礎(chǔ)上增加完善了開發(fā)環(huán)境下面的配置,主要包括下面幾件事情:
將webpack的熱重載客戶端代碼添加到每個entry對應的應用
合并基礎(chǔ)的webpack配置
配置樣式文件的處理規(guī)則,styleLoaders
配置Source Maps
配置webpack插件
var utils = require('./utils') var webpack = require('webpack') var config = require('../config') // webpack-merge是一個可以合并數(shù)組和對象的插件 var merge = require('webpack-merge') var baseWebpackConfig = require('./webpack.base.conf') // html-webpack-plugin用于將webpack編譯打包后的產(chǎn)品文件注入到html模板中 // 即自動在index.html里面加上和