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

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

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

[[420220]]

前言

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

快速上手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項目結構

下圖就是StrviewAPP項目組織結構。

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

  • config

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

  1. - webpack.base.js // 基礎配置 
  2.  
  3. - webpack.dev.js // 開發環境配置 
  4.  
  5. - webpack.pro.js // 生產環境配置 
  • public

資源文件夾。

  1. - favicon.ico  // 網站標識 
  2. index.html  // 模板文件 
  • .gitignore

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

  • .prettierrc

Prettier 規則配置文件。

  • package.json

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

  • src

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

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

Src文件夾詳析

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

1. main.js

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

  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用于創建視圖。那么,我們我們跳到下面看下這個API是怎么使用的。首先我們傳入一個對象字面量,第一個屬性是el屬性,它是掛載的DOM節點。第二個屬性是template屬性,它是用于顯示視圖的模板。第三個屬性是data屬性,傳入值為顯示的數據。最后,我們看到有這么一行注釋The event is handled after the createview API,意思是事件方法必須要在createViewAPI之后調用,即這里的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的關鍵之處,使用含有類似標簽語句的模板字符串來構建視圖。

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

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

最后,我們在標簽中都會發現類似這種{}符號,它是用來掛載數據的,也就是為了動態更新數據的。數據這塊我們后面再細講。

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這些前端框架中都有相應的應用。

我們先來看下這個文件夾的目錄結構。

  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 是一套不同的技術,允許您創建可重用的定制元素(它們的功能封裝在您的代碼之外)并且在您的web應用中使用它們。

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

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

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

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

  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

這個文件夾是負責存放數據狀態的文件,里面主要有這兩個文件。

  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(); 

就是調用這個方法。那么,我們下面看下這個methods文件夾,我們知道這個文件夾的作用是提供事件處理方法的。它的目錄結構如下:

  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這兩個方法前者負責處理復雜類型的數據,如數組、嵌套對象,后者處理簡單類型的數據,如單一對象、原始值。可以看到在上面代碼我們通過調用reactive()、ref()這兩個方法來實現數據的響應式,然后導出這兩個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文件夾引入的之前導出的兩個方法。通過定義一個數組,來不斷地循環調用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

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

項目啟動

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 

項目一覽

結語

謝謝你的閱讀!

 

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

 

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

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腳手架架構

2021-01-07 05:34:07

腳手架JDK緩存

2023-11-21 17:36:04

OpenFeignSentinel

2018-06-11 14:39:57

前端腳手架工具node.js

2018-08-30 16:08:37

Node.js腳手架工具

2014-08-15 09:36:06

2021-04-28 16:10:48

開發腳手架 Spring

2022-04-24 11:33:47

代碼管理工程

2022-07-18 07:58:46

Spring工具工具類

2021-08-09 11:16:04

監控系統架構技術

2021-10-08 06:10:43

前端技術Vue

2020-08-19 08:55:47

Redis緩存數據庫

2021-09-05 17:22:08

Strview.js工具js

2025-05-26 08:45:00

AvueVue.js前端

2016-08-10 14:59:41

前端Javascript工具

2020-05-19 10:13:45

Java開發代碼

2016-09-07 15:35:06

VueReact腳手架
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 青青草一区二区 | 欧美日韩国产一区二区三区 | 男女在线网站 | 91精品国产91久久久久久最新 | 福利av在线| 日韩精品一区二区三区中文在线 | 色综合色综合色综合 | 黄网站色大毛片 | 国产一区二区三区 | 99免费在线 | 国产午夜精品一区二区三区四区 | 国产亚洲一区二区在线观看 | 国产欧美日韩一区 | 久久久久成人精品免费播放动漫 | 国产精品一二区 | 欧美久久一区二区三区 | 亚洲一区二区三区视频 | 99国内精品久久久久久久 | 国产精品日韩一区二区 | 国产精品欧美一区二区三区不卡 | 五月综合久久 | 国产精品视频久久久 | 久久av一区二区三区 | 成人h免费观看视频 | 国产一区二区三区视频 | 日韩视频一区 | h视频在线免费 | 日韩在线免费视频 | 国产激情精品一区二区三区 | 欧美日韩在线一区二区三区 | 91成人在线视频 | 91精品国产99| 成人精品久久久 | 国产精品久久久久久久久久妞妞 | 精品一区二区三区视频在线观看 | 日本一区二区高清不卡 | 久久99国产精一区二区三区 | 中文字幕视频在线观看 | 日本久久久久久 | 亚洲精品高清视频在线观看 | 亚洲一区二区在线播放 |