vue項目啟動命令個人學習記錄
一、前言
最近在看vue框架,發現啟動命令邏輯比較復雜,在這裡總結一波。
註意,下面的總結以本人的項目為例,不同項目可能細節不同,僅供參考。
二、啟動命令詳解
1.項目啟動前,需要先裝好nodejs,並用npm install安裝好依賴。
2.本人的項目中,vue啟動命令為:
npm run compile
其中,npm run xxx會執行package.json中配置的命令,例如package.json中,有:
"scripts": { "compile": "cross-env SERVER_ENV=test node build/dev-server.js", },
所以實際執行的會是cross-env SERVER_ENV=test node build/dev-server.js命令。
3.cross-env命令,作用是實現跨平臺配置環境變量,SERVER_ENV=test就是自己配置的一個環境變量,後續js等文件會用到。
(就是windows和linux都可以用 cross-env key=value 來配置環境變量的意思)
4.node命令,可以執行js文件,所以node build/dev-server.js實際執行的就是項目根目錄/build/dev-server.js文件。
(因為是在項目根目錄執行的npm run compile命令,所以build/dev-server.js就是從項目根目錄開始的;其中dev-server.js是自己編寫的一個js文件)
5.dev-server.js文件中,有:
//這個會打印test,上面配置的環境變量 console.log("env1",process.env.SERVER_ENV) //這個會打印prod,因為沒有配置ENV1 console.log("env2",`"${process.env.SERVER_ENV1 || 'prod'}"`) //這個會打印test,上面配置的環境變量 console.log("env3",`"${process.env.SERVER_ENV || 'prod'}"`) const config = require('../config') //這個打印內容 console.log("config",config)
這個的意思是,聲明一個變量config,內容是當前js文件的、上一個目錄中的、config文件夾中的index.js文件。(自己編寫的index.js文件)
註意,隻讀取文件夾下的index.js文件,不讀取其它js文件。
6.config/index.js文件中,有:
//這個是讀取node_modules的path依賴,解析路徑用的(類似jar包) const path = require('path') //這個是讀取同級目錄下的test.js文件 const testEnv = require('./test') module.exports = { test: { env: testEnv, port: 10001, assetsSubDirectory: 'static', assetsPublicPath: process.env.SERVER_ENV === 'test' ? '/sub-path-test/' : '/sub-path/', proxyTable: { api: { filter: '/sub-path-test/**', changeOrigin: true, target, onProxyReq(proxyReq) { proxyReq.setHeader( 'Cookie', `SESSION=6b7c231d-1133-40cf-c566-332f6dtxfa72` ) }, }, }, }, }
這個文件中,因為有module.exports,所以第5步中可以require到。
這個文件中,有個變量testEnv,配置到瞭module.exports的json串中,它的值下面會寫。
7.config/test.js文件中,有:
//這個也是node_modules裡的依賴方法,用來合並成json用 const merge = require('webpack-merge'); //這個讀取的是同級目錄下的prod.js文件 const prodEnv = require('./prod'); //這個把json合並瞭下,然後exports瞭 module.exports = merge(prodEnv, { TEST_ENV: '"test_env"', });
8.config/prod.js文件中,有:
module.exports = { PROD_ENV: '"prod_env"', };
9.現在,回到dev-server.js文件(第5步),其中的config變量的內容為:
config { test: { env: { TEST_ENV: '"test_env"', PROD_ENV: '"prod_env"' }, port: 10001, assetsSubDirectory: 'static', assetsPublicPath: '/sub-path-test/', proxyTable: { api: [Object] } } }
10.dev-server.js文件中,主要有以下代碼:
//node_modules裡的依賴,框架方法 const express = require('express') //執行這個方法,獲得返回值 const app = express() //node_modules裡的依賴,解析路徑用 const path = require('path') //從config對象(json)裡獲取到子路徑相關 //posix是一種平臺兼容寫法,與join相同,也是把路徑拼接起來 //staticPath="/sub-path-test/static" const staticPath = path.posix.join( config.test.assetsPublicPath, config.test.assetsSubDirectory ) //配置虛擬子路徑、以及靜態資源目錄 //意思是,訪問/sub-path-test/static時,訪問的類似是當前目錄(一般是dist目錄)下的static文件夾中的內容 //例如,http://localhost:10001/sub-path-test/static/a.png,訪問的就是static文件夾裡的a.png app.use(staticPath, express.static('./static')) //啟動項目,設置啟動後的端口,10001 const port = config.test.port module.exports = app.listen(port, err => { if (err) { console.log(err) } })
這段代碼的意思是,使用瞭express框架,設置瞭一個虛擬訪問路徑與靜態資源目錄,設置瞭一個項目啟動端口。
例如,訪問http://localhost:10001/sub-path-test/static/a.png,訪問的類似是static文件夾裡的a.png
註意,項目打包後,在dist文件夾中、會生成a.png;
不過,隻啟動項目的話,並不會打包、dist文件夾是空的,不過也能訪問到,是框架實現的。
11.dev-server.js文件中,還用到瞭:
//node_modules依賴方法 const webpack = require('webpack') //自己配置的一個js文件 const webpackConfig = require('./webpack.dev.conf') //調用瞭下webpack方法 const compiler = webpack(webpackConfig) //獲得瞭個變量devMiddleware const devMiddleware = require('webpack-dev-middleware')(compiler, { //總之,這個的值也是 config.test.assetsPublicPath,就是"/sub-path-test/" publicPath: webpackConfig.output.publicPath, noInfo: false, quiet: false, stats: { colors: true, }, }) //給app設置瞭下 app.use(devMiddleware)
這段還沒有全看明白,總之就是設置瞭個publicPath,也是/sub-path-test,感覺類似express.static那裡。
實現的效果是,當訪問http://localhost:10001/sub-path-test/user/user-detail.html時,訪問的實際上類似是…/dist/user/user-detail.html。
(是/user/user-detail/app.vue等文件最後生成的user.html文件,如果打包的話就能看到瞭。)
註意,隻啟動項目的話,並不會打包、dist文件夾是空的,不過也能訪問到,是框架實現的。
12.可以根據環境變量不同、配置不同的虛擬訪問路徑(例如測試用sub-path-test、生產用sub-path);
然後就可以在nginx中、根據某些變量不同、訪問不同的路徑、就是訪問不同的環境(例如某些人的賬號訪問測試、某些人的賬號訪問準生產等,用來自測);
然後可以在公共js方法中,做一些判斷,如果是測試url、或者如果環境變量是test、就在發送請求方法處增加setHeader('Cookie','asd-adf-ad-123-adf')等方法,用來自測。
三、總結
1.上方的啟動命令與相關文件,是根據本人的項目總結的,僅供參考,不同項目細節可能不同。
2.項目啟動命令可以自己配置,過程如上,需要熟悉node_modules中的一些依賴方法。(本人新學,好多都不熟悉,無從入手,隻能先看,總結一波自己理解的)
3.可以配置本地vue項目啟動時、端口號與訪問前綴路徑;
需要註意的是,項目打包部署到服務器上後又會有所區別,服務器上主要是在nginx中配置訪問端口與前綴路徑的,而不是在vue項目中。
到此這篇關於vue項目啟動命令的文章就介紹到這瞭,更多相關vue項目啟動命令內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 如何本地運行vue dist文件
- Vue-CLI3.x 自動部署項目至服務器的方法步驟
- webpack幾種手動實現HMR的方式
- webpack搭建vue環境時報錯異常解決
- uni-app多環境部署解決方案詳解