新聞中心
前言
前幾天,因?yàn)榻柚丛创a的熱乎勁,搞了一個(gè)玩具Js庫(kù)Strview.js。為什么會(huì)搞這么一個(gè)玩具庫(kù)呢?其實(shí)也不全是因?yàn)橥砩祥e的沒事,主要還是想通過實(shí)操來(lái)鍛煉自己的開發(fā)能力。之前,我也寫過一篇文章,那篇文章只是大體介紹了一下,沒有深究。之前大家可能覺得它跟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
你可以通過StrviewCLI快速初始化StrviewAPP項(xiàng)目,你可以這樣:
全局安裝。
- npm i strview-cli -g
安裝完成之后,你可以查看版本。
- strview-cli -v
最后,就是初始化項(xiàng)目了, 是自定義項(xiàng)目名稱。
- strview-cli init
or
- 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è)文件,分別如下:
- - webpack.base.js // 基礎(chǔ)配置
- - webpack.dev.js // 開發(fā)環(huán)境配置
- - webpack.pro.js // 生產(chǎn)環(huán)境配置
- public
資源文件夾。
- - favicon.ico // 網(wǎng)站標(biāo)識(shí)
- - index.html // 模板文件
- .gitignore
哪些文件不需要添加到版本管理中。
- .prettierrc
Prettier 規(guī)則配置文件。
- package.json
定義了這個(gè)項(xiàng)目所需要的各種模塊,以及項(xiàng)目的配置信息(比如名稱、版本、許可證等元數(shù)據(jù))。
- src
這個(gè)文件夾是StrviewAPP項(xiàng)目的主要文件夾,下面我們來(lái)看下這個(gè)文件夾里面到底有什么。
- - assets //存放靜態(tài)文件
- - components // 組件文件夾
- - data // 公用狀態(tài)文件夾
- - methods // 方法文件夾
- - style // 樣式文件夾
- - template // 模板文件夾
- - App.js // 頁(yè)面入口
- - 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)容。
- import { createView } from 'strview';
- import data from './data';
- import App from './App';
- import methods from './methods';
- createView({
- el: "#app",
- template: App,
- data
- });
- // The event is handled after the createview API
- 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
上面說到,App.js用與顯示視圖的模板,那么下面我們來(lái)看下。
- import myParagraph from './components/myParagraph';
- import card from './components/card';
- import helloTemplate from './template/helloTemplate';
- import './style/index.css';
- const App = `
- ${helloTemplate}
{a},,(a和b都改變)
- {age}
- {name}
- {msg}
{a},(a會(huì)改變)
,(b會(huì)改變)
{obj.a.b}
{arr}
{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)容,不過不要著急,我們慢慢來(lái)。你在這里只需要記住它們?cè)谶@里占位就可以了。
你可能會(huì)看到 這種標(biāo)簽,你可能說沒見過!這只是一個(gè)自定義組件。具體為什么這樣寫,我們下面到組件時(shí)再分析。但是需要說明的是,如果我們組件中需要存放內(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
上面說到,這個(gè)文件夾是存放模板文件的,我們就一探究竟。
- - helloTemplate.css
- - helloTemplate.js
helloTemplate.css樣式文件沒有什么好說的。
- .container {
- text-align: center;
- margin-top: 100px;
- line-height: 46px;
- }
- .container > img {
- margin-bottom: 40px;
- }
helloTemplate.js我們來(lái)看下這個(gè)js文件。
- import logo from '../assets/logo.png';
- import './helloTemplate.css';
- export default `
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)。
- - card.js
- - myParagraph.js
可以看到,有兩個(gè)js文件。
先看myParagraph.js這個(gè)文件。
- customElements.define('my-paragraph',
- class extends HTMLElement {
- constructor() {
- super();
- const template = document.getElementById('my-paragraph');
- const templateContent = template.content;
- this.attachShadow({ mode: 'open' }).appendChild(
- templateContent.cloneNode(true)
- );
- }
- }
- );
- const myParagraph = `
- p {
- color: white;
- background-color: #666;
- padding: 5px;
- }
My default text - Let's have some different text!
- Let's have some different text!
- In a list!
- `
- 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è)例子。
- 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)顯示。
- p {
- color: white;
- background-color: #666;
- padding: 5px;
- }
My default text
我們接著看下面代碼,它們都是用 包裹起來(lái)。另外,標(biāo)簽里面則是普通的標(biāo)簽語(yǔ)句。但是,有一點(diǎn)不一樣的是,這些普通的標(biāo)簽語(yǔ)句都有一個(gè)slot屬性,這個(gè)屬性用于當(dāng)作插槽的模板。
- Let's have some different text!
- Let's have some different text!
- In a list!
分析完了myParagraph.js文件,我們接著分析card.js文件。
其實(shí)與myParagraph.js文件一樣,只不過它是負(fù)責(zé)定義組件。在上面的App.js中,我們提到我們需要在自定義組件前使用一個(gè)占位符${},如這里的${card},card是引入的組件,就是指的它。
- customElements.define('my-card',
- class extends HTMLElement {
- constructor() {
- super();
- const template = document.getElementById('my-card');
- const templateContent = template.content;
- this.attachShadow({ mode: 'open' }).appendChild(
- templateContent.cloneNode(true)
- );
- }
- }
- );
- const card = `
- div {
- color: #333;
- background-color: #f4f4f4;
- padding: 5px;
- }
- `
- export default card
5. data
這個(gè)文件夾是負(fù)責(zé)存放數(shù)據(jù)狀態(tài)的文件,里面主要有這兩個(gè)文件。
- - index.js
- - ob.js
我們先來(lái)看下index.js文件,非常簡(jiǎn)單,就是單純的導(dǎo)出一個(gè)對(duì)象,另外ob.js文件也是。
index.js
- import ob from './ob';
- export default {
- a: "Hello",
- b: 18,
- name: "maomin",
- age: 9,
- msg: 'Strview',
- arr: ['0'],
- obj: {
- a: {
- b: 1
- }
- },
- ob
- }
ob.js
- export default {
- name: 'kk'
- }
6. methods
我們?cè)趍ain.js文件中中提到一點(diǎn)。
- import methods from './methods';
- // The event is handled after the createview API
- methods();
就是調(diào)用這個(gè)方法。那么,我們下面看下這個(gè)methods文件夾,我們知道這個(gè)文件夾的作用是提供事件處理方法的。它的目錄結(jié)構(gòu)如下:
- - index.js
- - item.js
先來(lái)看下item.js這個(gè)文件。
- import { reactive, ref } from 'strview'
- function executes() {
- reactive().obj.a.b = 3;
- ref().name = 'Strview.js';
- }
- function useItem() {
- ref().b = 100;
- }
- export {
- executes,
- useItem
- }
我們可以看到在頭部引入了兩個(gè)方法,reactive、ref這兩個(gè)方法前者負(fù)責(zé)處理復(fù)雜類型的數(shù)據(jù),如數(shù)組、嵌套對(duì)象,后者處理簡(jiǎn)單類型的數(shù)據(jù),如單一對(duì)象、原始值??梢钥吹皆谏厦娲a我們通過調(diào)用reactive()、ref()這兩個(gè)方法來(lái)實(shí)現(xiàn)數(shù)據(jù)的響應(yīng)式,然后導(dǎo)出這兩個(gè)executes()、useItem()方法。
接著,我們來(lái)看下index.js文件。
- import { eventListener } from 'strview';
- import { executes, useItem } from './item';
- const eventList = [
- ['.color-red', 'click', executes],
- ['.list>li:nth-child(2)', 'click', useItem]
- ]
- function methods() {
- for (let index = 0; index < eventList.length; index++) {
- const element = eventList[index];
- eventListener(...element);
- }
- }
- export default methods
我們首先在文件頂部引入了一個(gè)eventListener方法,然后接著從item文件夾引入的之前導(dǎo)出的兩個(gè)方法。通過定義一個(gè)數(shù)組,來(lái)不斷地循環(huán)調(diào)用eventListener方法。最后導(dǎo)出methods方法。
7. style
這個(gè)是存放樣式的文件,不過多介紹了。
index.css
- * {
- margin: 0;
- padding: 0;
- font-family: Avenir, Helvetica, Arial, sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- }
- .content {
- text-align: center;
- margin-top: 50px;
- }
8. assets
這個(gè)文件夾存放的是靜態(tài)資源,比如圖片之類的資源。
項(xiàng)目啟動(dòng)
1.初始化安裝依賴
- yarn install
OR
- npm run start
2.啟動(dòng)項(xiàng)目
- yarn build
OR
- npm run start
3.打包部署
- yarn build
OR
- npm run build
項(xiàng)目一覽
結(jié)語(yǔ)
謝謝你的閱讀!
這個(gè)腳手架相比于現(xiàn)在熱門的前端框架中的腳手架肯定是沒有可比性,可以當(dāng)做是玩具吧!也可以當(dāng)做自己看源碼之后自己的一些感悟吧!
文章名稱:基于Strview.js項(xiàng)目腳手架StrviewApp是怎么搭建起來(lái)的?
網(wǎng)頁(yè)路徑:http://fisionsoft.com.cn/article/codposd.html


咨詢
建站咨詢
