React第一個專案

安裝 create-react-app

打開電腦裡的終端機來進行 create-react-app 的套件下載

1
npm install create-react-app

建置一個 React.js 的專案

在終端機輸入 cd 你的資料夾名稱

1
npx create-react-app 專案名稱

//cd 專案名稱
npm run start
預設網域在 localhost:3000

JSX 瀏覽器看不懂?要翻譯就靠 Babel

1
npm install @babel/runtime --save-dev

Javascript 目錄

功能 解析
js 三元運算子
charAt() 從一個字符串中返回指定的字符
concat() 合併兩個或多個數組
copyWrithin()拷貝索引
every() 是否全部都符合
flat() 創建一個新數組,其中所有子數組元素以遞歸方式連接到指定深度。
fill() 填充
findIndex() 尋找陣列中符合的元素,並返回其 index(索引)
find() 回傳第一個滿足測試函式的元素值
filter() 建立指定函式,由原陣列過濾指定函數產生新陣列
forEach() 迴圈的陣列
indexOf() 檢查某元素是否在陣列中
includes() 是否在其條目中包含某個值,返回true或 false
join() 連接數組
push() 將一個或多個元素加入數組
pop() 從數組刪除(移除)最後一個元素並返回該元素
map() 迴圈的陣列,產生一個新陣列
Math.abs() 基數的平方
Math.floor() 取得整數
Math.pow() 次方
Math.sprt() 平方
Math.max() 查詢最大值
Math.min() 查詢最小值
Math.random() 虛擬亂數
Math.round() 四捨五入
Math.ceil() 無條件進位
Math.trunc() 去掉小數部分
Math.imul() 乘法
Math.atan() 以弧度計算直角三角形的角度
Math.asin() 返回數字的Math.asin()反正弦(以弧度為單位)
Math.atan2() 靜態方法返回平面中正 x 軸與從 (0, 0) 到點 (x, y) 的射線之間的角度(以弧度為單位)
Math.acos() 返回數字的Math.acos()反餘弦值(以弧度為單位)
Math.cos() 返回以弧度為單位的數字的餘弦值
Math.tan() 返回以弧度為單位的數字的正切值
Math.sin() 三角函數sin
shift() 從數組刪除(移除)第一個元素並返回該元素
slice() 從數組中返回選定(擷取)的元素,作為一個新數組。
split() 分割
splice() 從數組移除或是取代數量
some() 至少一個符合
sort()排序
trim()清空左右兩邊空白
trimEnd()清空結束空白
trimStart()清空開始空白
toString()把陣列轉成字串
toLowerCase()把字符轉為英文小寫
toUpperCase()把字串轉換成英文大寫
reverse()反轉
reduce()相加
reduceRight()相減
replaceAll() 取代所有字符內相同數據
unshift() 從數組新增(添加)第一個元素並返回該元素

Vite & Webpack

</tr>
index項目ViteWebpack
1 原理 直接啟動開發伺服器後的打包,請求哪個模組才編譯 先打包,然後啟動開發伺服器,請求伺服器給予打包
2 HMR(熱更新) 改動模組 ,僅需讓柳覽器重新請求該模組 相關依賴全部編譯
3 優點
啟動快,做出來的網站google網站評分較高
按需動態編譯的方式,極大的縮減了編譯時間,專案越複雜、模組越多,Vite 的優勢越明顯。
內置支持 TypeScript / less / sass / stylus / postcss(需要單獨安裝所對應的編譯器)
生態龐大,遇到問題90% 網路上都有辦法解決。
支持vue-class-component
4 缺點
沒有webpack成熟,無法做到太細部的調整。
生態沒有webpack龐大,遇到問題90%需要自己解決(但現在有越來越好)
vite不支持vue-class-component
構建耗時、專案越大編譯速度越慢。
做出來的網站google網站評分較低
5 環境變數方面
Vite預設沒有process.env,必須另外設定。
它有專門的屬性import.meta 除了我們自行定義的環境變數,Vite 還有內建四個它設定的環境變數讓我們運用:

三考

Vue優化

長列表效能優化

  1. 不做響應式:
    比如會員列表、商品列表之類的,只是純粹的資料展示,不會有任何動態改變的場景下,就不需要對資料做響應化處理,可以大大提升渲染速度。
    Vue3 裡則是新增了響應式flag
  2. 虛擬捲動:vue-virtual-scroller、vue-virtual-scroll-list

v-for 遍歷避免同時使用 v-if

列表使用唯一 key

使用 v-show 複用 DOM

無狀態的元件用函數式元件

子元件分割

變數在地化:把會多次參照的變數儲存起來

第三方外掛按需引入

路由懶載入

keep-alive快取頁面

比如在表單輸入頁面進入下一步後,再返回上一步到表單頁時要保留表單輸入的內容、比如在列表頁>詳情頁>列表頁,這樣來回跳轉的場景等

我們都可以通過內建元件 來把元件快取起來,在元件切換的時候不進行解除安裝,這樣當再次返回的時候,就能從快取中快速渲染,而不是重新渲染,以節省效能

  • 也可以用 include/exclude 來 快取/不快取 指定元件
  • 可通過兩個生命週期 activated/deactivated 來獲取當前元件狀態

事件的銷燬

Vue 元件銷燬時,會自動解綁它的全部指令及事件監聽器,但是僅限於元件本身的事件。
而對於定時器、addEventListener 註冊的監聽器等,就需要在元件銷燬的生命週期勾點中手動銷燬或解綁,以避免記憶體洩露。

圖片懶載入:

推薦一個第三方外掛 vue-lazyload
v-LazyLoad 代替 src

SSR優化

Vue2、Vue3區別

index項目Vue2Vue3
1生命週期函數beforeCreate與createdstepup代替beforeCreate與created
2響應式原理apiEs5 Object.defineProperty()進⾏數據劫持,結合發布訂閱的⽅式實現使⽤的是Es6 Proxy代理,使⽤ref或者reactive將數據轉化為響應式數據
3渲染策略提供類似於HTML的模板語法,將模板編譯成渲染函數來返回虛擬DOM樹
1.在DOM樹級別。
2.編譯器積極地檢測模板中的靜態節點、子樹甚至數據對象,並在生成的代碼中將它們提升到渲染函數之外
3.在元素級別。編譯器還根據需要執行的更新類型,為每個具有動態綁定的元素生成一個優化標誌。例如,具有動態類綁定和許多靜態屬性的元素將收到一個標誌,提示只需要進行類檢查。運行時將獲取這些提示並採用專用的快速路徑。
4Diff算法的提升小於Vue3大於Vue2
5打包體積變化未使用的代碼文件都被打包了進去,所以後期項目大了,打包文件會特別多還很大允許現代模式下的module bundler能夠靜態地分析模塊依賴關係,並刪除與未使用的module.exports屬性相關的代碼。模板編譯器還生成了對樹抖動友好的代碼,只有在模板中實際使用某個特性時,該代碼才導入該特性的幫助程序
6建立數據 data選項類型API(Options API)組合類型API(Composition API)
7typeScript的支持支持類型的,用的是Facebook的Flow做類型檢查 借鑒了react hook實現了更自由的編程方式,提出了Composition API,Composition API不需要通過指定一長串選項來定義組件,而是允許用戶像編寫函數一樣自由地表達、組合和重用有狀態的組件邏輯,同時提供出色的TypeScript支持。
8事件偵聽器緩存 綁定事件每次觸發都要重新生成全新的function去更新 提供了事件緩存對象,cacheHandlers,當 cacheHandlers 開啟,會自動生成一個內聯函數,同時生成一個靜態節點。當事件再次觸發時,只需從緩存中調用即可,無需再次更新
9異步組件-defineAsyncComponent:
loader:同工廠函數;
loadingComponent:加載異步組件時展示的組件;
errorComponent:加載組件失敗時展示的組件;
delay:顯示loadingComponent之前的延遲時間,單位毫秒,默認200毫秒;
timeout:如果提供了timeout,並且加載組件的時間超過了設定值,將顯示錯誤組件,默認值為Infinity(單位毫秒);
suspensible:異步組件可以退出控制,並始終控制自己的加載狀態。具體可以參考文檔;
onError:一個函數,該函數包含4個參數,分別是error、retry、fail和attempts,這4個參數分別是錯誤對象、重新加載的函數、加載程序結束的函數、已經重試的次數。
10自定義渲染render
h 從 Vue 2.x 的參數傳遞,改為全域導入
渲染函數參數的更動,使狀態元件和函數式元件之間更加一致。
vnode 現在有一個扁平的 prop 結構。
h 現在是全域導入,而不是作為參數自動傳遞,render 函式不再接收任何參數。。

JavaScript 中的 Var、Let 和 Const 有什麼區別

作用域不同 問題
var 聲明的作用域是全局的或函數/局部的
可以重新聲明和修改
聲明的變量會被提升到其作用域的頂部,並使用 undefined 值對其進行初始化
let 塊級作用域
可以被修改但是不能被重新聲明
聲明的變量會被提升到其作用域的頂部,不會對值進行初始化。
const 聲明的變量保持常量值,在塊級作用域內
不能被修改並且不能被重新聲明
聲明的變量會被提升到其作用域的頂部,不會對值進行初始化。

正則表達式

i 修飾符是用來執行不區分大小寫的匹配。

g 修饰符是用于执行全文的搜索(而不是在找到第一个就停止查找,而是找到所有的匹配)。

[a-z] //匹配所有的小寫字母

[A-Z] //匹配所有的大寫字母

[a-zA-Z] //匹配所有的字母

[0-9] //匹配所有的數字

[0-9\.\-] //匹配所有的數字,句號和減號

[ \f\r\t\n] //匹配所有的白字符

[^a-z] //除了小寫字母以外的所有字符

[^\\\/\^] //除了(\)(/)(^)之外的所有字符

[^\"\'] //除了雙引號(")和單引號(')之外的所有字符

^[a-zA-Z_]$ //所有的字母和下劃線

^a$ // 字母a

^a{4}$ // aaaa

^a{2,4}$ // aa,aaa或aaaa

^a{1,3}$ //a,aa或aaa

^[1-9][0-9]{0,}$ // 所有的正整數

^\-{0,1}[0-9]{1,}$ // 所有的整數

^[-]?[0-9]+\.?[0-9]+$ // 所有的浮點數

^[a-zA-Z0-9_]+$ // 所有包含一个以上的字母、數字或下劃線的字符串

^[1-9][0-9]*$ // 所有的正整數

^\-?[0-9]+$ // 所有的整數

^[-]?[0-9]+(\.[0-9]+)?$ // 所有的浮點數

26 個大小寫英文字母表示為 a-zA-Z

數字表示為 0-9

下劃線表示為 _

中劃線表示為 -

Promise.all

Promise.all

function promeseA (){
   return new Premise((resole,reject)=>{
       setTimeout(()=>{
        console.log('A')
        resole('A')
      },1000)
     
   })
}
function promeseB (){
   return new Premise((resole,reject)=>{
     setTimeout(()=>{
        resole('B')
      },3000)
     
   })
}

Promise.all().then(resole=>{
console.log('Promise.all',resole);
})

最终返回的结果
//“[object Array] (2) [“A”,”B”]