基于vue的企業級可用前端框架(開篇)

哇,很久沒有寫文章(總結)了。最近稍微有了一點點時間,也想對自己學習的知識進行系統性的總結。那么就開始搞一個有點用的東西吧:一行一行代碼寫一個基于vue的企業級可用前端框架。

我們從利用vue-cli手腳架工具創建項目開始,一步一步的建設我們的基礎框架。首先,我會詳細的講解PCweb端項目的建設過程,并編寫每一行代碼。然后,在此基礎上再介紹移動端web項目的建設,當然也會編寫完整的代碼。完整可運行的項目代碼會同步推送GitHub。

GitHub地址:

大綱

此前端框架基于vue + axios + antd-vue + vue-router現實,用webpack打包。框架主要包含:

1.配置模塊,主要是webpack編譯打包的一些配置項;

2.HTTP請求模塊,基于axios和qs的封裝,主要是用于向后端發起http請求;

3.接口層模塊,在這里調用http請求模塊發起請求,管理每一個接口,同時包含mock數據;

4.一個自動生成接口層文件的插件,嚴格說這個不屬于此框架的代碼,打包也不會包含此代碼,這只是提高開發的效率;

5.資源模塊,這里主要放置一些靜態的資源,如CSS、image等;

6.通用組件模塊,這里主要是一些全局或多個頁面都會用到的組件;

7.視圖模塊,此部分是最常用的開發目錄,項目中的一個個頁面都在這里;

8.路由模塊,基于vue-router實現路由的跳轉和控制,這路由的配置會用到一個叫“auto-vue-routes-plugin”的插件,它可以實現自動的配置路由,大大的提供開發效率,讓人用的爽;這個插件是我老大編寫的,已經提交到npm,此項目引用;

9.存儲模塊,主要是封裝了localStorage和sessionStorage的操作,用于存儲數據。這里暫時不考慮引入vuex,需要開發中大型應用又需要管理更多狀態時可自行引入;

10.公共方法模塊,這里主要是一些全局公共的方法,如存儲處理、數據校驗、數據加密、對象和數據的處理、excel處理、正則等;

11.登錄模塊,主要處理登錄部分的一些邏輯;

12.權限模塊,主要是處理數據權限的一些邏輯。

框架結構圖

OK,整個業務框架基本就包含以上模塊,上一個結構圖,更直觀一點:

框架結構圖

安裝開發工具

當然首先就是安裝需要的開發工具包啦,一步一步、一個一個來。

在這過程中,我們需要理清需要什么工具,這些工具都是干什么的,為什么需要它。搞清楚這些很重要。

1. Visual Studio Code ,簡稱VS Code。

前端開發非常好用的一個代碼編輯器。直接下載安裝最新版即可。官網下載地址:https://code.visualstudio.com

VS Code

2. Node.js。

選擇對應版本下載安裝。我安裝的版本是v12.13.0。官網下載地址:https://nodejs.org/en/

安裝的node版本以及包含的npm版本

Node.js 這個項目最初是被稱為web.js,就是一個高性能的、基于事件循環的、輕量的web服務器,并提供了一套庫。后來項目的發展超出了預期,已經不再是一個單純的web服務器了,到現在已經發展為一個平臺,它是一個高性能的web服務器,它能解析JavaScript語言(內封了V8引擎),它提供了一套庫讓JS有了I/O能力,它還包含了一個軟件安裝包的管理工具npm,已經變成了一個構件網絡應用的基礎框架。所以,在node這個平臺上,你可以用JS去開發一些獨立的程序,就像python、java那樣,開發一些有I/O讀寫的可直接運行的程序(我們知道,沒有node之前,JS都只能在瀏覽器中運行,沒法開發獨立可運行的程序),更重要的是可以用JS去開發后端服務,這是一個巨大的變化和創新。從此JS不再局限于瀏覽器了。

從上面關于node的介紹來看,這個跟我們開發web程序好像沒有什么關系,web程序不需要node的啊。的確,我們開發的在瀏覽器中運行的web程序是不需要node的,但是我們在開發web程序的過程中,需要用到node。所以,我們要搞清楚:

生產環境并不需要node.js,只是開發的時候用。

生產環境不需要安裝node.js,我們只是開發web項目的時候會用到node.js?;趘ue開發的web項目,部署到生產環境的時候只需要通過CDN引入vue,或者將vue打包到項目中即可,當然如果用了其他的庫同樣需要引入。vue項目,其實就是個web項目,打包之后最終就是一些js文件、image文件和html文件。這些都是靜態的文件,可用web服務器來運行,通常是用nginx。

我們開發的時候需要調試web程序,那么需要把web程序在一個服務器中跑起來,一般會用到一個叫 webpack-dev-server 的服務器(下面介紹)。

項目開發完成后需要編譯打包,我們會用到 webpack(下面介紹)。

而這兩者都是基于node實現和運行的。管理依賴包需要npm,這也是node提供的。

所以,我們開發需要安裝node。

引申問題補充說明:

(1)webpack-dev-server 是一個采用 Node.js Express 實現的微型服務器, 內部使用 webpack-dev-middleware 來響應發送到服務器監聽端口的HTTP請求。它由webpack 提供,用于前端項目的本地開發和調試。詳見官方文檔:https://www.webpackjs.com/guides/development/#%E4%BD%BF%E7%94%A8-webpack-dev-server

(2)Express 是一個保持最小規模的靈活的 Node.js Web 應用程序開發框架,為 Web 和移動應用程序提供一組強大的功能。Express 提供精簡的基本 Web 應用程序功能,而不會隱藏您了解和青睞的 Node.js 功能。

(3)Koa 是一個新的 web 框架,由 Express 幕后的原班人馬打造,致力于成為 web 應用和 API 開發領域中的一個更小、更富有表現力、更健壯的基石。 通過利用 async 函數,Koa 幫你丟棄回調函數,并有力地增強錯誤處理。 Koa 并沒有捆綁任何中間件, 而是提供了一套優雅的方法,幫助您快速而愉快地編寫服務端應用程序。

(4)關于package.json里面配置的依賴包,在打包的時候是否都會被打包到項目代碼中?記住,webpack打包是根據入口文件遞歸的去生成一個依賴圖,這圖中出現的文件才會被打包。簡單來說,就是項目中import的包才會被打包,而僅僅是在package.json里面配置的依賴包只會在npm install的時候安裝到node_modules目錄下面,那些在代碼中被import的包會從這個目錄下面尋找。

OK,安裝了 VS Code 和 Node.js 我們可以進行開發了。至于上面提到webpack 、webpack-dev-server 什么的,我們利用npm在項目中再安裝,而不是全局安裝到系統中。這些是項目依賴的東西。

框架項目結構

1.初始化項目

初始化項目需要用到一個叫做vue手腳架的工具 vue-cli 。

vue-cli 是 vue 的腳手架,用于生成一個基于vue和webpack的項目模板。說白了,就是vue-cli是一個軟件工具,利用它可以初始化生成一個vue項目,這個項目會有一些目錄結構、一些配置文件,并且是利用webpack去打包。此項目已經可以直接運行,接下來可以在此基礎上進行開發。

vue-cli 分為舊版本和新版本:3.x以下的是舊版本,3.x(含)以上的是新版本。由于我們安裝的node版本是v12.13.0,比較高,vue-cli 3.x以下的版本用到的一些node庫已經被廢棄,所以,我們需要安裝3.x版本。

全局安裝?vue-cli,我安裝的版本是 3.0.1。?

打開powershell,運行命令: npm install -g @vue/cli@3.0.1 。

安裝成功之后,輸入 vue -V 查看版本號??赡軙龅綀箦e,大概是:xxxxxx因為在此系統上禁止運行腳本xxx。解決方法:以管理員身份運行powershell,輸入?set-ExecutionPolicy RemoteSigned ,接著輸入 Y 。

解決輸入?vue -V? 報錯

再來查看版本號,成功輸出:

查看 vue-cli 版本號

一些補充說明:

(1)3.x 版本之后,vue-cli 的包名從 vue-cli 改成了 @vue/cli。3.x 版本新增了圖形化的方式來創建項目。

(2)vue-cli 的安裝:

3.0以下:npm install -g vue-cli@版本號

3.0及以上:npm install -g @vue/cli@版本號

卸載

3.0以下:npm uninstall vue-cli -g

3.0及以上:npm uninstall -g @vue/cli

查看版本號

vue -V

vue --version

(3)安裝 vue-cli 之后是否自動安裝了 webpack ?答:不會的??梢则炞C一下:

并未安裝webpack

(4)不推薦全局安裝webpack,webpack 作為一個項目打包工具應該跟項目走,可以用不同的版本去打包項目。而且在項目中也沒有必要再去手動的安裝webpack,因為用vue-cli初始化項目的時候會安裝這些依賴包了,并且會生成一個?package.json 文件,此文件會記錄了生成環境和開發環境需要用到的一些依賴包,其中就會包含webpack,說明webpack已經安裝好了,當然也肯定會包含 vue 。這些依賴包都會下載安裝在項目中一個叫?node_modules 的文件夾里面。當你把node_modules文件刪除了,可以項目中運行 npm install ,便會根據?package.json 文件的記錄重新下載并安裝這些依賴包。

(5)webpack 是什么?webpack是一個模塊打包工具,可以使用webpack管理項目中的模塊依賴,并編繹輸出靜態文件。它能夠很好地管理、打包Web開發中所用到的HTML、Javascript、CSS以及各種靜態文件(圖片、字體等),讓開發過程更加高效。對于不同類型的資源,webpack有對應的模塊加載器loader。webpack模塊打包器會分析模塊間的依賴關系,最后生成優化且合并后的靜態資源。其插件功能提供了處理各種文件過程中的各個生命周期鉤子,使開發者能夠利用插件功能開發很多自定義的功能。詳看官網介紹:https://www.webpackjs.com/concepts/?。

OK,接下來我們初始化一個vue項目:

首先檢查一遍安裝的工具,一切正常:

檢測安裝的工具

由于vue-cli3 初始化項目的命令與2版本不一樣,但是我還是想用舊版本的vue init 功能初始化項目。

根據說明,安裝@vue/cli-init即可,輸入命令: npm install -g @vue/cli-init 。

安裝舊版本的 vue init 功能

OK,一切準備就緒,開始初始化項目,輸入??vue init webpack admin-web-front 。

其中:vue init 是指令,webpack 是模板類型,admin-web-front 是項目名稱。指令形式是?vue init <template-name> <project-name>,兩種常用的模板類型:?webpack-simple 和 webpack。

初始化 vue 項目

說明:

Vue build standalone // 獨立構建;

Install vue-router? Yes // 安裝路由,用于導航到不同的頁面;

Use ESLintto lint your code? Yes // 安裝 ESLint 代碼檢測工具,格式、寫法等的檢查,可以規范化代碼;

Pick a test runner jest? // 單元測試;

Setup e2e tests with Nightwatch? Yes? // 端到端測試;


初始化完成,查看項目目錄:

初始化 vue 項目

目錄結構說明:

admin-web-front :

├── build? ? ? ? ? ? ? ? ? ? # 存放構建腳本,例如 webpack 配置文件

├── config? ? ? ? ? ? ? ? ? # 存放配置信息

├── node_modules? ? ? ? ? ? # 一些依賴包

├── src? ? ? ? ? ? ? ? ? ? ? # 除首頁外,其他源代碼

? ? ├── assets? ? ? ? ? ? ? ? ? # 存放代碼之外的資源,例如圖片、字體

? ? ├── components? ? ? ? ? ? ? # 存放除了App.vue主組件之外的其他組件,vue 組件的后綴都是 .vue

? ? ├── router? ? ? ? ? ? ? ? ? # 路由

? ? ├── App.vue? ? ? ? ? ? ? ? ? # 主組件

? ? └── main.js? ? ? ? ? ? ? ? ? # JS 入口文件

├── static? ? ? ? ? ? ? ? ? # 存放靜態資源

└── test? ? ? ? ? ? ? ? ? ? # 單元測試代碼

├── .babelrc? ? ? ? ? ? ? ? # babel 配置文件

├── .editorconfig

├── .eslintignore

├── .eslintrc? ? ? ? ? ? ? ? # ESLint 配置文件

├── .gitignore

├── .postcssrc

├── index.html? ? ? ? ? ? ? # 首頁

├── package.json? ? ? ? ?# 需要的依賴包

├── package-lock.json? ?# 項目安裝的依賴包版本

└── README.md


我們打開 package.json 文件看看:

package.json 文件

可以看到,我們在初始化項目的時候輸入的一些信息都記錄在這里了,指定了 vue 和 vue-router 版本 (符號 ^ 的作用是更新到主版本的最新版),一些開發的時候用到的依賴包。

繼續往下看:

package.json 文件

可以看到,package.json 文件里面開發依賴包包含了 webpack ,大版本是3。說明已經安裝好 webpack了,所以這就是為什么前面會提到我們不需要在項目中再去手動的安裝webpack。即使把依賴包刪除了,我們只要運行 npm install 命令,package.json 里面記錄的依賴包都會被安裝。

OK,來驗證一下:

首先看看是否安裝了 webpack :

運行 npm run build,打包此vue項目:

測試 webpack 打包項目
項目目錄中多了一個dist文件夾,里面有打包后的文件

OK,已經成功利用webpack打包項目了。


2.?webpack3 升級到 webpack4

接下來再做一件事情:把webpack升級到版本4,因為注意到,官方宣傳webpack4相比webpack3構建速度能夠提升60%-98%,聽起來真是讓人心動,有什么理由不升級呢。

(1)各依賴包都需要升級,直接修改?package.json 文件 devDependencies 部分,用以下內容替換原來的:

ps: 也可以直接修改項目中各個依賴包的版本號(就是要升級版本),記得加上?"mini-css-extract-plugin": "^0.4.5" 因為原來的沒有。

"devDependencies": {

"autoprefixer": "^9.3.1",

"babel-core": "^6.26.3",

"babel-eslint": "^10.0.1",

"babel-helper-vue-jsx-merge-props": "^2.0.3",

"babel-jest": "^23.6.0",

"babel-loader": "^7.1.5",

"babel-plugin-component": "^1.1.1",

"babel-plugin-dynamic-import-node": "^2.2.0",

"babel-plugin-syntax-jsx": "^6.18.0",

"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",

"babel-plugin-transform-runtime": "^6.23.0",

"babel-plugin-transform-vue-jsx": "^3.7.0",

"babel-polyfill": "^6.26.0",

"babel-preset-env": "^1.7.0",

"babel-preset-stage-2": "^6.24.1",

"babel-register": "^6.26.0",

"chalk": "^2.4.1",

"chromedriver": "^2.44.0",

"copy-webpack-plugin": "^4.6.0",

"cross-spawn": "^6.0.5",

"css-loader": "^1.0.1",

"eslint": "^4.19.1",

"eslint-config-standard": "^10.2.1",

"eslint-friendly-formatter": "^4.0.0",

"eslint-loader": "^2.1.1",

"eslint-plugin-import": "^2.14.0",

"eslint-plugin-node": "^8.0.0",

"eslint-plugin-promise": "^4.0.1",

"eslint-plugin-standard": "^3.1.0",

"eslint-plugin-vue": "^4.7.1",

"file-loader": "^2.0.0",

"filemanager-webpack-plugin": "^2.0.5",

"friendly-errors-webpack-plugin": "^1.7.0",

"html-webpack-plugin": "^3.2.0",

"mini-css-extract-plugin": "^0.4.5",

"jest": "^23.6.0",

"jest-serializer-vue": "^2.0.2",

"nightwatch": "^0.9.12",

"node-notifier": "^5.3.0",

"optimize-css-assets-webpack-plugin": "^5.0.1",

"ora": "^3.0.0",

"portfinder": "^1.0.19",

"postcss-import": "^12.0.1",

"postcss-loader": "^3.0.0",

"postcss-px2rem": "^0.3.0",

"postcss-url": "^8.0.0",

"rimraf": "^2.6.2",

"semver": "^5.6.0",

"shelljs": "^0.8.3",

"stylus": "^0.54.5",

"stylus-loader": "^3.0.2",

"uglifyjs-webpack-plugin": "^1.1.1",

"url-loader": "^1.1.2",

"vue-jest": "^3.0.0",

"vue-loader": "^14.2.2",

"vue-style-loader": "^4.1.2",

"vue-template-compiler": "^2.5.17",

"webpack": "^4.26.0",

"webpack-bundle-analyzer": "^3.0.3",

"webpack-cli": "^3.1.2",

"webpack-dev-server": "^3.1.10",

"webpack-merge": "^4.1.4"

},

(2)替換插件?extract-text-webpack-plugin,使用?webpack4?推薦的插件?mini-css-extract-plugin ,修改文件:build/webpack.prod.conf.js (灰色底色的部分是修改的地方):

替換?extract-text-webpack-plugin
替換??extract-text-webpack-plugin
替換??extract-text-webpack-plugin

(3)刪除?webpack.optimize.CommonsChunkPlugin 相關配置,修改文件:build/webpack.prod.conf.js (灰色底色的部分是修改的地方):

刪除?webpack.optimize.CommonsChunkPlugin 相關配置

(4)增加 optimization 配置,修改文件:build/webpack.prod.conf.js (灰色底色的部分是修改的地方):

增加 optimization 配置

??optimization:?{

????runtimeChunk:?{

??????name:?'manifest'

????},

????minimizer:?[

??????new?UglifyJsPlugin({

????????cache:?true,

????????parallel:?true,

????????sourceMap:?config.build.productionSourceMap,

????????uglifyOptions:?{

??????????warnings:?false

????????}

??????}),

??????new?OptimizeCSSPlugin({

????????cssProcessorOptions:?config.build.productionSourceMap

????????????{?safe:?true,?map:?{?inline:?false?}}

??????????:?{?safe:?true?}

??????})

????],

????splitChunks:?{

??????chunks:?'async',

??????minSize:?30000,

??????minChunks:?1,

??????maxAsyncRequests:?5,

??????maxInitialRequests:?3,

??????name:?false,

??????cacheGroups:?{

????????vendors:?{

??????????test:?/[\\/]node_modules[\\/]/,

??????????name:?'vendors',

??????????chunks:?'initial',

??????????priority:?-10

????????}

??????}

????}

??}


(5)修改 utils 配置,修改文件:build/utils?.js (灰色底色的部分是修改的地方):

修改 utils 配置
修改 utils 配置

(6)增加 mode 配置,修改文件:build/webpack.base.conf.js(灰色底色的部分是修改的地方):

增加 mode 配置

(7)在 .babelrc 文件添加?transform-es2015-modules-commonjs,主要是解決 export 和 import 共用導致不兼容而引起的錯誤:

添加?transform-es2015-modules-commonjs


最后,刪除?package-lock.json 文件和 node_modules目錄,最后運行 npm install ,等待安裝完成即可。

OK, 一切都改好了,我們來跑起初始化的vue項目,運行 npm run dev。

跑起項目

在瀏覽器輸入:http://localhost:8080 ,OK,可以看到項目已經跑起來并且可以訪問了:

訪問初始化的vue項目

3. 按劃分的模塊調整項目結構

娃等我很久了,先跟他玩玩,今晚繼續這部分內容。

提取公共代碼:通用組件、公共方法、自動生成接口層文件的插件、http請求、數據存儲。

做成單獨的項目,打包編譯,然后在具體項目中引入。

總結

OK,萬事開頭難,這頭我們已經開好了。

本篇文章首先介紹了將要開發的前端框架主要包含配置模塊、HTTP請求模塊、接口層模塊、資源模塊、通用組件模塊、路由模塊、視圖模塊、存儲模塊、公共方法模塊、登錄模塊、權限模塊和一個自動生成接口層文件的插件。

接著介紹了需要的開發工具包并講解了每個工具的作用。

最后利用vue-cli初始化項目并調整目錄結構。還介紹了如何把webpack3升級到webpack4。

題外話:其實如果僅僅是為了跑起一個vue項目,可以簡單很多的,需要的工具都安裝新版本,初始化,運行即可。我這里整的這么復雜,一來,我比較喜歡舊的項目結構,二來,換webpack版本、換node版本等這些在工作中可能都會遇到,在這里可以找到答案,三來,折騰得越多,對用到的工具就更加了解。


備注:

1.項目未上傳GitHub (文章開頭的GitHub地址未添加),等調整完結構再上傳;

2.項目結構未調整;

3.項目的配置問題,等到后面處理配置模塊的時候再進行優化處理;軟件工程領域的經驗:不要過早的優化,在項目的初期不要把知道的優化點都加入到項目中,這樣會增加項目的復雜度而且也沒有多大的優化效果,等項目到了一定的規模,性能問題會隨之而來,然后再針對性的優化,效果自然是最理想的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容