成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Vue或React的多頁應用腳手架

開發 架構
一直以來都在研究多頁應用如何能有一套像SPA一樣優雅的開發模式。本套架構在項目上使用感覺還不錯(已跑在上百個頁面的項目上),所以決定開源出來給大家。閱讀完本文能實現在項目中使用ES6(7)+組件化(.vue | .jsx)開發多頁應用

前言

一直以來都在研究多頁應用如何能有一套像SPA一樣優雅的開發模式

本套架構在項目上使用感覺還不錯(已跑在上百個頁面的項目上),所以決定開源出來給大家

閱讀完本文能實現在項目中使用ES6(7)+組件化(.vue | .jsx)開發多頁應用

(其實我是想把它做為大家多頁應用的腳手架)

目錄結構介紹

TIPS:任何的項目的架構都和目錄結構有關,所以這部分非常重要,請仔細耐心閱讀

我們先宏觀的看下結構

  1. |--- public // 生產環境下所需的文件 
  2.     |--- static 
  3.         |--- css 
  4.         |--- es6 
  5.         |--- fonts 
  6.         |--- images 
  7.     |--- views 
  8. |--- src 
  9.     |--- assets 
  10.         |--- fonts 
  11.         |--- images 
  12.     |--- components 
  13.     |--- js 
  14.     |--- sass 
  15.     |--- static 
  16.         |--- css 
  17.         |--- es6 
  18.         |--- fonts 
  19.         |--- images 
  20.     |--- views  

src里的assets,components,js,sass里的文件***都會生成到src/static下,這個作為我們dev中引用的資源文件。而public不用說,是線上訪問的文件。

我們展開介紹下具體的頁面應該如何對應它的資源。拿js和views為例

  1. |--- views 
  2.     |--- home // 官網介紹 業務模塊 
  3.         |--- index.html 
  4.         ... 
  5.     |--- shopping // 購物業務模塊 
  6.         |--- buy.html 
  7.         ... 
  8. |--- js 
  9.     |--- lib 
  10.         |--- vue.js 
  11.         |--- react.js 
  12.         |--- react.dom.js 
  13.         ... 
  14.     |--- home // 官網介紹業務模塊的js 
  15.         |--- index.js 
  16.         ... 
  17.     |--- shopping // 購物業務模塊的js 
  18.         |--- buy.js 
  19.         ... 
  20.     tools.js 
  21.     common.js  

在多頁應用中,往往我們的頁面以業務模塊劃分,業務模塊由許多的頁面組成。

如home,shopping,可能就分別為官網介紹和購物的業務模塊。在這業務模塊下,分別有許多個頁面,那我們的js文件也需要命名一一對應。

當然,我們還有第三方的js庫是不需要編譯的,所以我們專門用一個lib文件夾來存放他們。(包括你自己編寫的指令或者filter等,不需要編譯的,也直接放在lib下引入即可)

另外,你還有許多自己寫的需要編譯的工具庫直接放在js目錄下即可(如,tools.js,common.js)

我們的sass也是同理 

  1. |--- sass 
  2.     |--- home 
  3.         |--- index.scss 
  4.         ... 
  5.     |--- shopping 
  6.         |--- buy.scss 
  7.         ...  

他們編譯在static下的文件將為

  1. |--- static 
  2.     |--- css // scss 編譯后的 
  3.         |--- home 
  4.             |--- index.css 
  5.         |--- shopping 
  6.             |--- buy.css 
  7.     |--- js // babel處理后的js 
  8.         |--- home 
  9.             |--- index.js 
  10.         |--- shopping 
  11.             |--- buy.js  

頁面引用的路徑就為(home/index.html為例) 

  1. ... 
  2. <link rel="stylesheet" href="../../static/css/home/index.css"
  3.  
  4. ... 
  5.  
  6. <script src="../../static/es6/lib/vue(react).js"></script> 
  7. <script src="../../static/es6/lib/react.dom.js"></script> 
  8. <script src="../../static/es6/home/index.js"></script> 
  9. ...  

js和sass搞定了后,我們的難點是編寫組件的過程中,如何知道應該編譯哪個入口js文件呢?

所以我們需要對我們的組件名進行一些約定,這也就是約定大于配置的前提。 

  1. |--- components 
  2.     |--- home // home 業務模塊 
  3.         |--- home-header.vue(jsx) 
  4.         |--- index-info.vue(jsx) 
  5.         ... 
  6.     |--- shopping  // shopping 業務模塊 
  7.         |--- buy-list.vue(jsx) 
  8.         ...  

我們components下的業務模塊名和之前的sass,js一樣。具體組件那就有所不同。

我們分為幾種類型的組件

一、當前頁面使用的組件

二、當前業務模塊下的公用組件

三、所有業務模塊的通用組件

當前頁面組件的命名,我們約定為 [頁面]-[組件].vue(jsx)

如下 

  1. |--- components 
  2.     |--- home 
  3.         |--- index-info.vue(jsx)  

這個 index-info 的組件就僅僅只有在home/index.html頁面下使用,當你修改了這個組件后,會自動編譯home/index.js路口js文件并刷新頁面。

當前業務模塊下的公用組件,我們約定為 [業務模塊]-[組件].vue(jsx)

如下 

  1. |--- components 
  2.     |--- common 
  3.         |--- loading.vue(jsx)  

這個home-header組件就屬于home業務模塊下的公用組件,當你修改了這個組件后,會自動編譯home業務模塊下所有的js文件并刷新頁面。

剩下的就是所有業務模塊下的通用組件,我們約定全放在components/common目錄下,不需要具體命名約定 

  1. |--- components 
  2.     |--- common 
  3.         |--- loading.vue(jsx)  

這個loading組件就屬于所有業務模塊下的公用組件,當你修改了這個組件后,會自動編譯所有業務模塊下的js文件并刷新頁面。

編譯組件的原理以及為什么約定命名的原因是:

我會根據組件更改變動,去讀取文件夾名,組件名,并編譯對應名的路口js

至此,我們就把組件的問題也解決了

由于我采用的是主gulp輔webpack,webpack僅僅只編譯用,所以編譯基本達到秒編譯。比單純利用webpack做構建快得多。如果單純采用webpack做構建,需要去配置entry,配置HTMLPlugin。所以會慢得多,然而我這一套并不需要如此繁瑣。

圖片&&字體文件

這其實是一個大坑

我們的實現目標是組件能相對路徑引入圖片或字體文件 

  1. // 如 在html標簽里這樣 
  2. <template> 
  3.     <figure> 
  4.         <img src="../../assets/images/home/logo.jpg" alt="頭像"
  5.     </figure> 
  6. </template> 
  7.  
  8. // 在style里這樣 
  9. <style rel="stylesheet/scss" lang="sass"
  10.     @import "../../sass/home/index-info"
  11.     // 甚至可能在這@import面引入相對路徑,這都會算是在組件里引入相對路徑 
  12.     #bg h3 { 
  13.         background: url("../../assets/images/holmes.jpg"); 
  14.         color: #fff; 
  15.     } 
  16. </style>  

這個坑,真是不可描述,我個人嘗試了各種體位,才把這個坑配置好。

直接給大家看***實現是怎樣的。

dev 的路徑是這樣,頁面可以顯示圖片或字體。

 

build 后的路徑是這樣

 

這樣就達到了開發和發布后的資源統一,摸索這一步真是挺累的 T.T,有興趣的自己看源碼吧。

環境變量的配置

我們在webpack中經常會遇見不同環境下不同配置的問題

首先可在package.json里配置一條script

  1. // package.json 
  2. "scripts": { 
  3.     "build""NODE_ENV=production gulp build"
  4.     "dev""NODE_ENV=dev gulp reload" 
  5. },  

假設我們需要為不同環境配置不同的api請求地址,就可以利用我們在package.json設置的NODE_ENV來識別當前環境(這部分我在gulpfile中處理了,所以在文件里可直接識別NODE_ENV,如下)

  1. //  src/js/ajaxurl.js 
  2.   
  3. const server1 = 'https://production.server.com'
  4. const server2 = 'https://dev.server.com'
  5.  
  6. let useServer = null
  7. if(NODE_ENV === 'production') { 
  8.     useServer = server1; 
  9. else if(NODE_ENV === 'dev') { 
  10.     useServer = server2; 
  11.  
  12. export default useServer; 
  13. // src/js/home/index.js 
  14.  
  15. import url from '../ajaxurl'
  16. console.log(url);  

這樣就解決了我們不同環境下不同配置的問題,我默認配置了dev和production,大家可以自行拓展。比如

假設你需要在 開發中 配置測試,你可以寫一條NODE_ENV=test gulp reload。

如果需要 預發布打包 測試,就可以另一條NODE_ENV=preproduction gulp build。

總之就是打包使用gulp build,開發使用gulp reload。

注意事項

開發:執行命令 npm run dev

發布:執行命令 npm run build (BTW,別忘了去gulpfile.js里替換你的CDN鏈接,進入gulp文件修改 const CDN = 'yourCDNLink'這里的變量即可)

命名一定要按約定來!

命名一定要按約定來!

命名一定要按約定來!

否則不知道要編譯誰!!!

gulp配置很簡單,大家可以看一下針對各自項目進行修改,不懂得可以直接問我。

如果你們不完全的前后端分離,把這個src直接放在后臺目錄下也沒有問題。

寫vue和react都沒問題,我把示例demo都寫好了,下面是分別兩個的repo地址。

vue-multpage : https://github.com/MeCKodo/vue-multipage

react-multpage : https://github.com/MeCKodo/react-multipage

TODO

  • [ ] 項目的Unit test
  • [ ] 項目Cli腳手架

后話

本來是想寫成vue-cli或者是create-react-app這種cli腳手架的,但是!本人真是太懶又沒有時間了! 各位看官可以先嘗試clone把玩把玩,如果有足夠多人喜歡,我就把他寫成cli,發布npm :)

我是用mac下開發完成的,用了半天多時間專門去給window寫了兼容,window還可能會有bug,不是我說!window就是辣雞!

***給大家看下我們的某項目結構。

總覽

 

js部分

 

sass部分

 

組件和頁面

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2021-01-07 05:34:07

腳手架JDK緩存

2022-01-14 14:09:11

腳手架代碼自定義

2017-07-21 09:56:46

Webpack3 Vue.js腳手架

2022-12-12 08:56:45

Vite3Vite

2021-11-08 09:35:09

Vue代碼前端

2018-05-15 09:10:27

前端vue.jswebpack

2021-12-23 10:35:32

SpringCloud腳手架架構

2025-05-16 07:24:41

Springkafka腳手架

2021-05-21 05:22:52

腳手架工具項目

2020-03-20 08:32:41

物聯網腳手架傳感器

2018-06-11 14:39:57

前端腳手架工具node.js

2019-12-25 15:20:48

前端腳手架命令

2018-08-30 16:08:37

Node.js腳手架工具

2022-04-24 11:33:47

代碼管理工程

2023-11-21 17:36:04

OpenFeignSentinel

2014-08-15 09:36:06

2021-07-13 18:42:38

Spring Boot腳手架開發

2021-04-25 05:31:33

React.js項目FastReactAp

2024-03-11 13:18:00

RustClap項目

2021-10-08 06:10:43

前端技術Vue
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久中文字 | 91精品国产91久久久久久 | 久久精品国产99国产精品亚洲 | av入口| 久久久久久国产精品免费免费 | 日韩视频中文字幕 | 99精品国产一区二区三区 | 夜夜骑天天干 | 色偷偷人人澡人人爽人人模 | 一级免费毛片 | 精品成人 | 国产三级在线观看播放 | 91社区视频 | 国产成人精品久久二区二区91 | 久久久久久国产精品 | 精品久久久久久一区二区 | 国产综合久久久久久鬼色 | 免费观看成人鲁鲁鲁鲁鲁视频 | 国产免费播放视频 | 99国产视频 | 国产黄色在线 | 激情久久久久 | 成人三区四区 | 91资源在线 | 很很干很很日 | 日本a视频| 精品久久久久久久久久久久久久 | 特级黄一级播放 | 自拍偷拍精品 | 18gay男同69亚洲网站 | 午夜免费在线电影 | 日韩中文字幕在线观看视频 | 91网在线播放 | 九九热这里 | 国产精品久久久久久久久 | 成人免费看片网 | 日韩成人av在线 | 久久国内精品 | www.日韩 | 国产露脸国语对白在线 | 国产精品久久久久久久久久99 |