日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
基于Strview.js項(xiàng)目腳手架StrviewApp是怎么搭建起來(lái)的?

前言

前幾天,因?yàn)榻柚丛创a的熱乎勁,搞了一個(gè)玩具Js庫(kù)Strview.js。為什么會(huì)搞這么一個(gè)玩具庫(kù)呢?其實(shí)也不全是因?yàn)橥砩祥e的沒事,主要還是想通過(guò)實(shí)操來(lái)鍛煉自己的開發(fā)能力。之前,我也寫過(guò)一篇文章,那篇文章只是大體介紹了一下,沒有深究。之前大家可能覺得它跟Vue.js差不多,是的,正是借鑒Vue.js的思想,但是有些地方還是不一樣(個(gè)人覺得)。所以,今天,這篇文章介紹基于Strview.js搭建的項(xiàng)目腳手架工具StrviewApp。如果你覺得對(duì)自己有用,可以繼續(xù)看下去。如果覺得這篇肯定是篇垃圾文章,你也可以避而遠(yuǎn)之。好了,我們現(xiàn)在就進(jìn)去正題。準(zhǔn)備好了嗎?一起跟我來(lái)吧!

創(chuàng)新互聯(lián)專注于淮北網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供淮北營(yíng)銷型網(wǎng)站建設(shè),淮北網(wǎng)站制作、淮北網(wǎng)頁(yè)設(shè)計(jì)、淮北網(wǎng)站官網(wǎng)定制、小程序設(shè)計(jì)服務(wù),打造淮北網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供淮北網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

快速上手StrviewAPP

你可以通過(guò)StrviewCLI快速初始化StrviewAPP項(xiàng)目,你可以這樣:

全局安裝。

 
 
 
 
  1. npm i strview-cli -g

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

 
 
 
 
  1. strview-cli -v

最后,就是初始化項(xiàng)目了, 是自定義項(xiàng)目名稱。

 
 
 
 
  1. strview-cli init 

or

 
 
 
 
  1. strview-cli i 

這樣,一個(gè)StrviewAPP項(xiàng)目就這么搭建完成了。

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

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

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

  • config

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

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

資源文件夾。

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

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

  • .prettierrc

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

  • package.json

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

  • src

這個(gè)文件夾是StrviewAPP項(xiàng)目的主要文件夾,下面我們來(lái)看下這個(gè)文件夾里面到底有什么。

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

Src文件夾詳析

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

1. main.js

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

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

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

2. App.js

上面說(shuō)到,App.js用與顯示視圖的模板,那么下面我們來(lái)看下。

 
 
 
 
  1. import myParagraph from './components/myParagraph';
  2. import card from './components/card';
  3. import helloTemplate from './template/helloTemplate';
  4. import './style/index.css';
  5. const App = `
  6. ${helloTemplate}
  7.     點(diǎn)擊
  8.     {a},,(a和b都改變)

  9.     
  10.       
  11. {age}
  12.       
  13. {name}
  14.       
  15. {msg}
  16.     
  17.     {a},(a會(huì)改變)

  18.     ,(b會(huì)改變)

  19.     
  20.     

    {obj.a.b}

  21.     

    {arr}

  22.     

    {ob.name}

  • ${myParagraph}
  • ${card}
  • `
  • export default App
  • 我們看到在代碼的末尾導(dǎo)出了一個(gè)模板字符串,也就是常量App。我們可以看到模板字符串中都是些類似標(biāo)簽語(yǔ)句的代碼。是的,這也是Strview.js的關(guān)鍵之處,使用含有類似標(biāo)簽語(yǔ)句的模板字符串來(lái)構(gòu)建視圖。

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

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

    最后,我們?cè)跇?biāo)簽中都會(huì)發(fā)現(xiàn)類似這種{}符號(hào),它是用來(lái)掛載數(shù)據(jù)的,也就是為了動(dòng)態(tài)更新數(shù)據(jù)的。數(shù)據(jù)這塊我們后面再細(xì)講。

    3. template

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

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

    helloTemplate.css樣式文件沒有什么好說(shuō)的。

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

    helloTemplate.js我們來(lái)看下這個(gè)js文件。

     
     
     
     
    1. import logo from '../assets/logo.png';
    2. import './helloTemplate.css';
    3. export default `
    4.   
    5.   

      Hello Strview.js

  • `;
  • 在上面代碼中可以看到我們頭部引入了一個(gè)圖片還有一個(gè)樣式文件,下面接著導(dǎo)出了一個(gè)模板字符串。引入的圖片呢!使用${}占位符來(lái)綁定到img標(biāo)簽上。

    簡(jiǎn)單介紹下template文件夾之后,我們下面看下components文件夾。

    4. components

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

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

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

    可以看到,有兩個(gè)js文件。

    先看myParagraph.js這個(gè)文件。

     
     
     
     
    1. customElements.define('my-paragraph',
    2.     class extends HTMLElement {
    3.         constructor() {
    4.             super();
    5.             const template = document.getElementById('my-paragraph');
    6.             const templateContent = template.content;
    7.             this.attachShadow({ mode: 'open' }).appendChild(
    8.                 templateContent.cloneNode(true)
    9.             );
    10.         }
    11.     }
    12. );
    13. const myParagraph = `
    14.     My default text
    15. Let's have some different text!
    16.     
    17. Let's have some different text!
    18.     
    19. In a list!
    20. `
    21. export default myParagraph

    我們先看上一部分,customElements對(duì)象下有一個(gè)define方法。這是什么方法呢?其實(shí)這部分利用了Web Components。它是什么呢?我們?cè)贛DN這樣定義它的。

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

    Web Components拆開來(lái)講其實(shí)也挺復(fù)雜,我們?cè)谶@里就不詳細(xì)分析了。以下是MDN網(wǎng)址,大家可以跟著做幾個(gè)例子。

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

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

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

     
     
     
     
    1.     My default text

    我們接著看下面代碼,它們都是用 包裹起來(lái)。另外,標(biāo)簽里面則是普通的標(biāo)簽語(yǔ)句。但是,有一點(diǎn)不一樣的是,這些普通的標(biāo)簽語(yǔ)句都有一個(gè)slot屬性,這個(gè)屬性用于當(dāng)作插槽的模板。

     
     
     
     
    1. Let's have some different text!
    2.     
    3. Let's have some different text!
    4.     
    5. In a list!

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

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

     
     
     
     
    1. customElements.define('my-card',
    2.     class extends HTMLElement {
    3.         constructor() {
    4.             super();
    5.             const template = document.getElementById('my-card');
    6.             const templateContent = template.content;
    7.             this.attachShadow({ mode: 'open' }).appendChild(
    8.                 templateContent.cloneNode(true)
    9.             );
    10.         }
    11.     }
    12. );
    13. const card = `
    14.     
  • `
  • export default card
  • 5. data

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

     
     
     
     
    1. - index.js
    2. - ob.js

    我們先來(lái)看下index.js文件,非常簡(jiǎn)單,就是單純的導(dǎo)出一個(gè)對(duì)象,另外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
    15. }

    ob.js

     
     
     
     
    1. export default {
    2.     name: 'kk'
    3. }

    6. methods

    我們?cè)趍ain.js文件中中提到一點(diǎn)。

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

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

     
     
     
     
    1. - index.js
    2. - item.js

    先來(lái)看下item.js這個(gè)文件。

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

    我們可以看到在頭部引入了兩個(gè)方法,reactive、ref這兩個(gè)方法前者負(fù)責(zé)處理復(fù)雜類型的數(shù)據(jù),如數(shù)組、嵌套對(duì)象,后者處理簡(jiǎn)單類型的數(shù)據(jù),如單一對(duì)象、原始值??梢钥吹皆谏厦娲a我們通過(guò)調(diào)用reactive()、ref()這兩個(gè)方法來(lái)實(shí)現(xiàn)數(shù)據(jù)的響應(yīng)式,然后導(dǎo)出這兩個(gè)executes()、useItem()方法。

    接著,我們來(lái)看下index.js文件。

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

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

    7. style

    這個(gè)是存放樣式的文件,不過(guò)多介紹了。

    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. }
    8. .content {
    9.   text-align: center;
    10.   margin-top: 50px;
    11. }

    8. assets

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

    項(xiàng)目啟動(dòng)

    1.初始化安裝依賴

     
     
     
     
    1. yarn install

    OR

     
     
     
     
    1. npm run start

    2.啟動(dòng)項(xiàng)目

     
     
     
     
    1. yarn build

    OR

     
     
     
     
    1. npm run start

    3.打包部署

     
     
     
     
    1. yarn build

    OR

     
     
     
     
    1. npm run build

    項(xiàng)目一覽

    結(jié)語(yǔ)

    謝謝你的閱讀!

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


    網(wǎng)站標(biāo)題:基于Strview.js項(xiàng)目腳手架StrviewApp是怎么搭建起來(lái)的?
    瀏覽地址:http://www.dlmjj.cn/article/codposd.html