自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于Strview.js項目腳手架StrviewApp是怎么搭建起來的?

開發(fā) 前端
這篇文章介紹基于Strview.js搭建的項目腳手架工具StrviewApp。如果你覺得對自己有用,可以繼續(xù)看下去。

[[420220]]

前言

前幾天,因為借著看源碼的熱乎勁,搞了一個玩具Js庫Strview.js。為什么會搞這么一個玩具庫呢?其實也不全是因為晚上閑的沒事,主要還是想通過實操來鍛煉自己的開發(fā)能力。之前,我也寫過一篇文章,那篇文章只是大體介紹了一下,沒有深究。之前大家可能覺得它跟Vue.js差不多,是的,正是借鑒Vue.js的思想,但是有些地方還是不一樣(個人覺得)。所以,今天,這篇文章介紹基于Strview.js搭建的項目腳手架工具StrviewApp。如果你覺得對自己有用,可以繼續(xù)看下去。如果覺得這篇肯定是篇垃圾文章,你也可以避而遠之。好了,我們現(xiàn)在就進去正題。準備好了嗎?一起跟我來吧!

快速上手StrviewAPP

你可以通過StrviewCLI快速初始化StrviewAPP項目,你可以這樣:

全局安裝。

  1. npm i strview-cli -g 

安裝完成之后,你可以查看版本。

  1. strview-cli -v 

最后,就是初始化項目了, 是自定義項目名稱。

 

  1. strview-cli init <projectName> 

or

 

  1. strview-cli i <projectName> 

這樣,一個StrviewAPP項目就這么搭建完成了。

StrviewAPP項目結(jié)構(gòu)

下圖就是StrviewAPP項目組織結(jié)構(gòu)。

下面,我將介紹每個文件及文件夾的作用。

  • config

這個是webpack配置文件夾,關(guān)于webpack的配置都在這配置。文件夾中里面有如下三個文件,分別如下:

  1. - webpack.base.js // 基礎(chǔ)配置 
  2.  
  3. - webpack.dev.js // 開發(fā)環(huán)境配置 
  4.  
  5. - webpack.pro.js // 生產(chǎn)環(huán)境配置 
  • public

資源文件夾。

  1. - favicon.ico  // 網(wǎng)站標識 
  2. index.html  // 模板文件 
  • .gitignore

哪些文件不需要添加到版本管理中。

  • .prettierrc

Prettier 規(guī)則配置文件。

  • package.json

定義了這個項目所需要的各種模塊,以及項目的配置信息(比如名稱、版本、許可證等元數(shù)據(jù))。

  • src

這個文件夾是StrviewAPP項目的主要文件夾,下面我們來看下這個文件夾里面到底有什么。

  1. - assets //存放靜態(tài)文件 
  2. - components // 組件文件夾 
  3. - data // 公用狀態(tài)文件夾 
  4. - methods // 方法文件夾 
  5. - style // 樣式文件夾 
  6. - template // 模板文件夾 
  7. - App.js // 頁面入口 
  8. - main.js // 項目入口文件 

Src文件夾詳析

上面我們分析完了項目結(jié)構(gòu),那么下面我們將進一步分析Src文件夾中的文件構(gòu)成以及它們之間如何配合的。

1. main.js

首先,我們看下main.js文件,這是項目入口文件,我們來看下文件中的內(nèi)容。

  1. import { createView } from 'strview'
  2. import data from './data'
  3. import App from './App'
  4. import methods from './methods'
  5.  
  6. createView({ 
  7.   el: "#app"
  8.   template: App, 
  9.   data 
  10. }); 
  11.  
  12. // The event is handled after the createview API 
  13. methods(); 

我們先引入了strview.js,導入createView這個API用于創(chuàng)建視圖。那么,我們我們跳到下面看下這個API是怎么使用的。首先我們傳入一個對象字面量,第一個屬性是el屬性,它是掛載的DOM節(jié)點。第二個屬性是template屬性,它是用于顯示視圖的模板。第三個屬性是data屬性,傳入值為顯示的數(shù)據(jù)。最后,我們看到有這么一行注釋The event is handled after the createview API,意思是事件方法必須要在createViewAPI之后調(diào)用,即這里的methods();。

2. App.js

上面說到,App.js用與顯示視圖的模板,那么下面我們來看下。

  1. import myParagraph from './components/myParagraph'
  2. import card from './components/card'
  3. import helloTemplate from './template/helloTemplate'
  4. import './style/index.css'
  5.  
  6. const App = ` 
  7. ${helloTemplate} 
  8. <div class="content"
  9.     <button class="color-red">點擊</button> 
  10.     <p class="txt">{a},,(a和b都改變)</p> 
  11.     <ul class="list"
  12.       <li>{age}</li> 
  13.       <li>{name}</li> 
  14.       <li>{msg}</li> 
  15.     </ul> 
  16.     <p class="txt">{a},(a會改變)</p> 
  17.     <p class="txt">,(b會改變)</p> 
  18.     <input value="{msg}"></input> 
  19.     <p>{obj.a.b}</p> 
  20.     <p>{arr}</p> 
  21.     <p>{ob.name}</p> 
  22. </div> 
  23. ${myParagraph} 
  24. ${card}<my-card><span slot="my-card-txt"></span></my-card> 
  25.  
  26. export default App 

我們看到在代碼的末尾導出了一個模板字符串,也就是常量App。我們可以看到模板字符串中都是些類似標簽語句的代碼。是的,這也是Strview.js的關(guān)鍵之處,使用含有類似標簽語句的模板字符串來構(gòu)建視圖。

另外,我們看到頂部除了引入樣式文件,還從components文件夾引入了兩個文件,template文件夾中引入了一個文件。我們從前面目錄結(jié)構(gòu)知道,components文件夾存放的是組件,而template文件夾存放的是模板文件。如何將導入模板與組件呈現(xiàn)到頁面上呢?那么就需要在模板字符串中使用${}占位符。在這里你可能會感到很困惑,因為沒有看到這些文件中什么內(nèi)容,不過不要著急,我們慢慢來。你在這里只需要記住它們在這里占位就可以了。

你可能會看到這種標簽,你可能說沒見過!這只是一個自定義組件。具體為什么這樣寫,我們下面到組件時再分析。但是需要說明的是,如果我們組件中需要存放內(nèi)容時,我們需要在自定義組件前使用一個占位符${},如這里的${card},card是引入的組件。

最后,我們在標簽中都會發(fā)現(xiàn)類似這種{}符號,它是用來掛載數(shù)據(jù)的,也就是為了動態(tài)更新數(shù)據(jù)的。數(shù)據(jù)這塊我們后面再細講。

3. template

上面說到,這個文件夾是存放模板文件的,我們就一探究竟。

  1. - helloTemplate.css 
  2. - helloTemplate.js 

helloTemplate.css樣式文件沒有什么好說的。

  1. .container { 
  2.   text-align: center; 
  3.   margin-top: 100px; 
  4.   line-height: 46px; 
  5. .container > img { 
  6.   margin-bottom: 40px; 

helloTemplate.js我們來看下這個js文件。

  1. import logo from '../assets/logo.png'
  2. import './helloTemplate.css'
  3.  
  4. export default ` 
  5. <div class="container"
  6.   <img src="${logo}"/> 
  7.   <h1>Hello Strview.js</h1> 
  8. </div> 
  9. `; 

在上面代碼中可以看到我們頭部引入了一個圖片還有一個樣式文件,下面接著導出了一個模板字符串。引入的圖片呢!使用${}占位符來綁定到img標簽上。

簡單介紹下template文件夾之后,我們下面看下components文件夾。

4. components

這個文件夾的是存放組件的,組件這個概念大家可能非常熟悉,在目前Vue、React這些前端框架中都有相應(yīng)的應(yīng)用。

我們先來看下這個文件夾的目錄結(jié)構(gòu)。

  1. - card.js 
  2. - myParagraph.js 

可以看到,有兩個js文件。

先看myParagraph.js這個文件。

  1. customElements.define('my-paragraph'
  2.     class extends HTMLElement { 
  3.         constructor() { 
  4.             super(); 
  5.  
  6.             const template = document.getElementById('my-paragraph'); 
  7.             const templateContent = template.content; 
  8.  
  9.             this.attachShadow({ mode: 'open' }).appendChild( 
  10.                 templateContent.cloneNode(true
  11.             ); 
  12.         } 
  13.     } 
  14. ); 
  15.  
  16. const myParagraph = `<template id="my-paragraph"
  17. <style> 
  18.     p { 
  19.         color: white; 
  20.         background-color: #666; 
  21.         padding: 5px; 
  22.     } 
  23. </style> 
  24. <p> 
  25.     <slot name="my-text">My default text</slot> 
  26. </p> 
  27. </template> 
  28. <my-paragraph> 
  29. <span slot="my-text">Let's have some different text!</span> 
  30. </my-paragraph> 
  31. <my-paragraph> 
  32. <ul slot="my-text"
  33.     <li>Let's have some different text!</li> 
  34.     <li>In a list!</li> 
  35. </ul> 
  36. </my-paragraph>` 
  37.  
  38. export default myParagraph 

我們先看上一部分,customElements對象下有一個define方法。這是什么方法呢?其實這部分利用了Web Components。它是什么呢?我們在MDN這樣定義它的。

Web Components 是一套不同的技術(shù),允許您創(chuàng)建可重用的定制元素(它們的功能封裝在您的代碼之外)并且在您的web應(yīng)用中使用它們。

Web Components拆開來講其實也挺復雜,我們在這里就不詳細分析了。以下是MDN網(wǎng)址,大家可以跟著做幾個例子。

  1. https://developer.mozilla.org/zh-CN/docs/Web/Web_Components 

我們在這里是需要知道define方法第一個參數(shù)需要傳一個自定義標簽名,第二個參數(shù)是傳入一個類。需要自定義的地方是第一個參數(shù)與第二個參數(shù)中g(shù)etElementById()方法中的參數(shù),推薦使用相同的字符串。

調(diào)用define方法完成后,你需要在下面模板字符串中首先要使用template標簽包裹起來,你可以理解成初始化。我們可以看到在template標簽上有一個id選擇器與上面的getElementById()方法中的參數(shù)一樣。是的,這地方必須一一對應(yīng)。另外,我們看到緊接著下面有一個style標簽,這是定義組件樣式的。最后就是組件的內(nèi)容了。這里定義了一個p標簽,里面是一個插槽,定義了一個name屬性。并且這里有一個標簽文本,這個文本內(nèi)容是默認顯示的,如果組件中沒有內(nèi)容,則這個內(nèi)容就會默認顯示。

  1. <template id="my-paragraph"
  2. <style> 
  3.     p { 
  4.         color: white; 
  5.         background-color: #666; 
  6.         padding: 5px; 
  7.     } 
  8. </style> 
  9. <p> 
  10.     <slot name="my-text">My default text</slot> 
  11. </p> 
  12. </template> 

我們接著看下面代碼,它們都是用包裹起來。另外,標簽里面則是普通的標簽語句。但是,有一點不一樣的是,這些普通的標簽語句都有一個slot屬性,這個屬性用于當作插槽的模板。

  1. <my-paragraph> 
  2. <span slot="my-text">Let's have some different text!</span> 
  3. </my-paragraph> 
  4. <my-paragraph> 
  5. <ul slot="my-text"
  6.     <li>Let's have some different text!</li> 
  7.     <li>In a list!</li> 
  8. </ul> 
  9. </my-paragraph> 

     

     

 

 

分析完了myParagraph.js文件,我們接著分析card.js文件。

其實與myParagraph.js文件一樣,只不過它是負責定義組件。在上面的App.js中,我們提到我們需要在自定義組件前使用一個占位符${},如這里的${card},card是引入的組件,就是指的它。

  1. customElements.define('my-card'
  2.     class extends HTMLElement { 
  3.         constructor() { 
  4.             super(); 
  5.  
  6.             const template = document.getElementById('my-card'); 
  7.             const templateContent = template.content; 
  8.  
  9.             this.attachShadow({ mode: 'open' }).appendChild( 
  10.                 templateContent.cloneNode(true
  11.             ); 
  12.         } 
  13.     } 
  14. ); 
  15.  
  16. const card = `<template id="my-card"
  17. <style> 
  18.     div { 
  19.         color: #333; 
  20.         background-color: #f4f4f4; 
  21.         padding: 5px; 
  22.     } 
  23. </style> 
  24. <div> 
  25.     <slot name="my-card-txt"></slot> 
  26. </div> 
  27. </template> 
  28.  
  29. export default card 

5. data

這個文件夾是負責存放數(shù)據(jù)狀態(tài)的文件,里面主要有這兩個文件。

  1. index.js 
  2. - ob.js 

我們先來看下index.js文件,非常簡單,就是單純的導出一個對象,另外ob.js文件也是。

index.js

  1. import ob from './ob'
  2. export default { 
  3.     a: "Hello"
  4.     b: 18, 
  5.     name"maomin"
  6.     age: 9, 
  7.     msg: 'Strview'
  8.     arr: ['0'], 
  9.     obj: { 
  10.         a: { 
  11.             b: 1 
  12.         } 
  13.     }, 
  14.     ob 

ob.js

  1. export default { 
  2.     name'kk' 

6. methods

我們在main.js文件中中提到一點。

  1. import methods from './methods'
  2.  
  3. // The event is handled after the createview API 
  4. methods(); 

就是調(diào)用這個方法。那么,我們下面看下這個methods文件夾,我們知道這個文件夾的作用是提供事件處理方法的。它的目錄結(jié)構(gòu)如下:

  1. index.js 
  2. - item.js 

先來看下item.js這個文件。

  1. import { reactive, ref } from 'strview' 
  2.  
  3. function executes() { 
  4.     reactive().obj.a.b = 3; 
  5.     ref().name = 'Strview.js'
  6. function useItem() { 
  7.     ref().b = 100; 
  8.  
  9. export { 
  10.     executes, 
  11.     useItem 

我們可以看到在頭部引入了兩個方法,reactive、ref這兩個方法前者負責處理復雜類型的數(shù)據(jù),如數(shù)組、嵌套對象,后者處理簡單類型的數(shù)據(jù),如單一對象、原始值。可以看到在上面代碼我們通過調(diào)用reactive()、ref()這兩個方法來實現(xiàn)數(shù)據(jù)的響應(yīng)式,然后導出這兩個executes()、useItem()方法。

接著,我們來看下index.js文件。

  1. import { eventListener } from 'strview'
  2. import { executes, useItem } from './item'
  3.  
  4. const eventList = [ 
  5.     ['.color-red''click', executes], 
  6.     ['.list>li:nth-child(2)''click', useItem] 
  7.  
  8. function methods() { 
  9.     for (let index = 0; index < eventList.length; index++) { 
  10.         const element = eventList[index]; 
  11.         eventListener(...element); 
  12.     } 
  13.  
  14. export default methods 

我們首先在文件頂部引入了一個eventListener方法,然后接著從item文件夾引入的之前導出的兩個方法。通過定義一個數(shù)組,來不斷地循環(huán)調(diào)用eventListener方法。最后導出methods方法。

7. style

這個是存放樣式的文件,不過多介紹了。

index.css

  1. * { 
  2.   margin: 0; 
  3.   padding: 0; 
  4.   font-family: Avenir, Helvetica, Arial, sans-serif; 
  5.   -webkit-font-smoothing: antialiased; 
  6.   -moz-osx-font-smoothing: grayscale; 
  7. .content { 
  8.   text-align: center; 
  9.   margin-top: 50px; 

8. assets

這個文件夾存放的是靜態(tài)資源,比如圖片之類的資源。

項目啟動

1.初始化安裝依賴

  1. yarn install 

OR

  1. npm run start 

2.啟動項目

  1. yarn build 

OR

  1. npm run start 

3.打包部署

  1. yarn build 

OR

  1. npm run build 

項目一覽

結(jié)語

謝謝你的閱讀!

 

這個腳手架相比于現(xiàn)在熱門的前端框架中的腳手架肯定是沒有可比性,可以當做是玩具吧!也可以當做自己看源碼之后自己的一些感悟吧!

 

責任編輯:武曉燕 來源: 前端歷劫之路
相關(guān)推薦

2017-07-21 09:56:46

Webpack3 Vue.js腳手架

2021-08-12 00:03:37

JSStrview視圖

2021-09-18 08:52:45

人工智能

2021-12-23 10:35:32

SpringCloud腳手架架構(gòu)

2023-11-21 17:36:04

OpenFeignSentinel

2021-01-07 05:34:07

腳手架JDK緩存

2018-08-30 16:08:37

Node.js腳手架工具

2018-06-11 14:39:57

前端腳手架工具node.js

2021-04-28 16:10:48

開發(fā)腳手架 Spring

2014-08-15 09:36:06

2022-04-24 11:33:47

代碼管理工程

2022-07-18 07:58:46

Spring工具工具類

2020-08-19 08:55:47

Redis緩存數(shù)據(jù)庫

2021-10-08 06:10:43

前端技術(shù)Vue

2021-08-09 11:16:04

監(jiān)控系統(tǒng)架構(gòu)技術(shù)

2016-08-10 14:59:41

前端Javascript工具

2020-05-19 10:13:45

Java開發(fā)代碼

2016-09-07 15:35:06

VueReact腳手架

2021-04-25 05:31:33

React.js項目FastReactAp

2021-09-05 17:22:08

Strview.js工具js
點贊
收藏

51CTO技術(shù)棧公眾號