主頁 > 企業開發 > 初次在Vue專案使用TypeScript,需要做什么

初次在Vue專案使用TypeScript,需要做什么

2020-10-08 09:34:44 企業開發

前言

總所周知,Vue新版本3.0 使用 TypeScript 開發,讓本來就很火的 TypeScript 受到更多人的關注,雖然 TypeScript 在近幾年才火,但其實它誕生于2012年10月,正式版本發布于2013年6月,是由微軟撰寫的自由和開源的編程語言,TypeScript 是 JavaScript 的一個超集,擴展了 JavaScript 的語法,添加了可選的靜態型別和基于類的面向物件編程,

JavaScript開發中經常遇到的錯誤就是變數或屬性不存在,然而這些都是低級錯誤,而靜態型別檢查恰好可以彌補這個缺點,什么是靜態型別?舉個栗子:

//javascript 
let str = 'hello'
str = 100 //ok

//typescript
let str:string = 'hello'
str = 100 //error: Type '100' is not assignable to type 'string'.

可以看到 TypeScript 在宣告變數時需要為變數添加型別,如果變數值和型別不一致則會拋出錯誤,靜態型別只在編譯時進行檢查,而且最終編譯出來的代碼依然是 JavaScript,即使我們為 string 型別的變數賦值為其他型別,代碼也是可以正常運行的,

其次,TypeScript 增加了代碼的可讀性和可維護性,型別定義實際上就是一個很好的檔案,比如在呼叫函式時,通過查看引數和回傳值的型別定義,就大概知道這個函式如何使用,

準備作業

npm

安裝 typescript

npm install typescript @vue/cli-plugin-typescript -D

新增檔案

在專案的根目錄下創建 shims-vue.d.ts、shims-tsx.d.ts、tsconfig.json

  • shims-vue.d.ts
import Vue from 'vue';

declare module '*.vue' {
  export default Vue;
}
  • shims-tsx.d.ts
import Vue, { VNode } from 'vue';

declare global {
  namespace JSX {
    type Element = VNode
    type ElementClass = Vue
    interface IntrinsicElements {
      [elem: string]: any;
    }
  }
}
  • tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "experimentalDecorators":true,
    "sourceMap": true,
    "noImplicitThis": false,
    "baseUrl": ".",
    "types": [
      "webpack-env"
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}

ESLint配置

為什么使用 ESLint 而不是 TSLint?

今年1月份,TypeScript官方發布博客推薦使用ESLint來代替TSLint,而 ESLint 團隊將不再維護 typescript-eslint-parser,也不會在 Npm 上發布,任何使用 tyescript-eslint-parser 的用戶應該改用 @tyescript-eslint/parser

官方的解釋:

我們注意到TSLint規則的操作方式存在一些影響性能的體系結構問題,ESLint已經擁有了我們希望從linter中得到的更高性能的體系結構,此外,不同的用戶社區通常有針對ESLint而不是TSLint構建的lint規則(例如React hook或Vue的規則),鑒于此,我們的編輯團隊將專注于利用ESLint,而不是復制作業,對于ESLint目前沒有覆寫的場景(例如語意linting或程式范圍的linting),我們將致力于將ESLint的TypeScript支持與TSLint等同起來,

原文

如何使用

AlloyTeam 提供了一套全面的EsLint配置規范,適用于 React/Vue/Typescript 專案,并且可以在此基礎上自定義規則,
GitHub

安裝

npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-config-alloy

配置項的說明查看AlloyTeam ESLint 規則

配置

在專案的根目錄中創建.eslintrc.js,然后將以下內容復制到其中:

module.exports = {
  extends: [
    'alloy',
    'alloy/typescript',
  ],
  env: {
    browser: true,
    node: true,
  },
  rules: {
    // 自定義規則
    'spaced-comment': 'off',
    '@typescript-eslint/explicit-member-accessibility': 'off',
    'grouped-accessor-pairs': 'off',
    'no-constructor-return': 'off',
    'no-dupe-else-if': 'off',
    'no-import-assign': 'off',
    'no-setter-return': 'off',
    'prefer-regex-literals': 'off'
  }
};

補充

如果想知道配置項更多使用,可以到ESLint官網搜索配置項,

如果使用的是VScode,推薦使用ESLint插件輔助開發,

檔案改造

入口檔案

  1. main.js 改為 main.ts
  2. vue.config.js 修改入口檔案
const path = require('path')
module.exports = {
  ...
  pages: {
    index: {
      entry: path.resolve(__dirname+'/src/main.ts')
    },
  },
  ...
}

vue組件檔案

隨著TypeScript和ES6里引入了類,在一些場景下我們需要額外的特性來支持標注或修改類及其成員, 裝飾器(Decorators)為我們在類的宣告及成員上通過元編程語法添加標注提供了一種方式,

Vue 也為我們提供了類風格組件的 TypeScript 裝飾器,使用裝飾器前需要在 tsconfig.json 將 experimentalDecorators 設定為 true,

安裝vue裝飾器

vue-property-decorator庫完全依賴vue-class-component,在安裝時要一起裝上

npm install vue-class-component vue-property-decorator -D

改造.vue

只需要修改srcipt內的東西即可,其他不需要改動

<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
import draggable from 'vuedraggable'

@Component({
  created(){
    
  },
  components:{
    draggable
  }
})
export default class MyComponent extends Vue {
  /* data */
  private ButtonGrounp:Array<any> = ['edit', 'del']
  public dialogFormVisible:boolean = false
  
  /*method*/
  setDialogFormVisible(){
    this.dialogFormVisible = false
  }
  addButton(btn:string){
    this.ButtonGrounp.push(btn)
  }

  /*compute*/
  get routeType(){
    return this.$route.params.type
  }
}
</script>

類成員修飾符,不添加修飾符則默認為public

  • public:公有,可以自由訪問類的成員
  • protected:保護,類及其繼承的子類可訪問
  • private:私有,只有類可以訪問

Prop

!: 為屬性使用明確的賦值斷言修飾符,了解更多看檔案

import { Component, Vue, Prop } from "vue-property-decorator";
export default class MyComponent extends Vue {
  ...
  @Prop({type: Number,default: 0}) readonly id!: number
  ...
}

等同于

export default {
  ...
  props:{
    id:{
      type: Number,
      default: 0
    }
  }
  ...
}

Watch

import { Component, Vue, Watch } from "vue-property-decorator";
export default class MyComponent extends Vue {
  ...
  @Watch('dialogFormVisible')
  dialogFormVisibleChange(newVal:boolean){
    // 一些操作
  }
  ...
}

等同于

export default {
  ...
  watch:{
    dialogFormVisible(newVal){
      // 一些操作
    }
  }
  ...
}

Provide/Inject

// App.vue
import {Component, Vue, Provide} from 'vue-property-decorator'
@Component
export default class App extends Vue {
  @Provide() app = this
}

// MyComponent.vue
import {Component, Vue, Inject} from 'vue-property-decorator'
@Component
export default class MyComponent extends Vue {
  @Inject() readonly app!: Vue
}

等同于

// App.vue
export default {
  provide() {
    return {
      'app': this
    }
  }
}

// MyComponent.vue
export default {
  inject: ['app']
}

更多裝飾器使用,參考vue-property-decorator檔案

全域宣告

*.d.ts 檔案

目前主流的庫檔案都是 JavaScript 撰寫,TypeScript 身為 JavaScript 的超集,為支持這些庫的型別定義,提供了型別定義檔案(*.d.ts),開發者撰寫型別定義檔案發布到npm上,當使用者需要在 TypeScript 專案中使用該庫時,可以另外下載這個包,讓JS庫能夠在 TypeScript 專案中運行,

比如:md5 相信很多人都使用過,這個庫可以將字串轉為一串哈希值,這種轉化不可逆,常用于敏感資訊進行哈希再發送到后端進行驗證,保證資料安全性,如果我們想要在 TypeScript 專案中使用,還需要另外下載 @tyeps/md5,在該檔案夾的index.d.ts中可以看到為 md5 定義的型別,

/// <reference types="node" />

declare function md5(message: string | Buffer | Array<number>): string;

declare namespace md5 {}

export = md5;

TypeScript 是如何識別 *.d.ts

TypeScript 在專案編譯時會全域自動識別 *.d.ts檔案,我們需要做的就是撰寫 *.d.ts,然后 TypeScript 會將這些撰寫的型別定義注入到全域提供使用,

為vue實體添加屬性/方法

當我們在使用this.$route或一些原型上的方法時,typescript無法進行推斷,在編譯時會報屬性$route不存在的錯誤,需要為這些全域的屬性或方法添加全域宣告

對shims-vue.d.ts做修改,當然你也可以選擇自定義*.d.ts來添加宣告

import Vue from 'vue';
import VueRouter, { Route } from 'vue-router'

declare module '*.vue' {
  export default Vue;
}

declare module 'vue/types/vue' {
  interface Vue {
    $api: any;
    $bus: any;
    $router: VueRouter;
    $route: Route;
  }
}

自定義型別定義檔案

當一些型別或介面等需要頻繁使用時,我們可以為專案撰寫全域型別定義,
根路徑下創建@types檔案夾,里面存放*.d.ts檔案,專門用于管理專案中的型別定義檔案,

這里我定義個global.d.ts檔案:

//declare 可以創建 *.d.ts 檔案中的變數,declare 只能作用域最外層
//變數
declare var num: number;

//型別
type StrOrNum = string | number

//函式
declare function handler(str: string): void;

// 類
declare class User { 
  
}

//介面
interface OBJ {
  [propName: string]: any;
  [propName: number]: any;
}

interface RES extends OBJ {
  resultCode: number;
  data: any;
  msg?: string;
}

解放雙手,transvue2ts轉換工具

改造程序最麻煩的就是語法轉換,內容都是一些固定的寫法,這些重復且枯燥的作業可以交給機器去做,這里我們可以借助 transvue2ts 工具提高效率,transvue2ts 會幫我們把data、prop、watch等語法轉換為裝飾器語法,

安裝

npm i transvue2ts -g

使用

安裝完之后,transvue2ts 庫的路徑會寫到系統的 path中,直接打開命令列工具即可使用,命令的第二個引數是檔案的完整路徑,
執行命令后會在同級目錄生成轉換好的新檔案,例如處理view檔案夾下的index.vue,轉換后會生成indexTS.vue,

處理單檔案組件

transvue2ts D:\typescript-vue-admin-demo\src\pages\index.vue
=>
輸出路徑:D:\typescript-vue-admin-demo\src\pages\indexTS.vue

處理檔案夾下的所有vue組件檔案

transvue2ts D:\typescript-vue-admin-demo\src\pages
=>
輸出路徑:D:\typescript-vue-admin-demo\src\pagesTS

補充

不要以為有工具真就完全解放雙手,工具只是幫我們轉換部分語法,工具未能處理的語法和引數的型別定義,還是需要我們去修改的,要注意的是轉換后注釋會被過濾掉,

該工具作者在掘金對工具的介紹

關于第三方庫使用

一些三方庫會在安裝時,包含有型別定義檔案,使用時無需自己去定義,可以直接使用官方提供的型別定義,

node_modules中找到對應的包檔案夾,型別檔案一般都會存放在types檔案夾內,其實型別定義檔案就像檔案一樣,這些內容能夠清晰的看到所需引數和引數型別,

這里列出一些在 Vue 中使用三方庫的例子:

element-ui 組件引數

使用型別定義

import { Component, Vue } from "vue-property-decorator";
import { ElLoadingComponent, LoadingServiceOptions } from 'element-ui/types/loading'

let loadingMark:ElLoadingComponent; 
let loadingConfig:LoadingServiceOptions = {
  lock: true,
  text: "加載中",
  spinner: "el-icon-loading",
  background: "rgba(255, 255, 255, 0.7)"
};

@Component
export default class MyComponent extends Vue {
  ...
  getList() {
    loadingMark = this.$loading(loadingConfig);
    this.$api.getList()
      .then((res:RES) => {
        loadingMark.close();
      });
  }
  ...
}

element-ui/types/loading,原檔案里還有很多注釋,對每個屬性都做出描述

export interface LoadingServiceOptions {
  target?: HTMLElement | string
  body?: boolean
  fullscreen?: boolean
  lock?: boolean
  text?: string
  spinner?: string
  background?: string
  customClass?: string
}
export declare class ElLoadingComponent extends Vue {
  close (): void
}
declare module 'vue/types/vue' {
  interface Vue {
    $loading (options: LoadingServiceOptions): ElLoadingComponent
  }
}

vue-router 鉤子函式

使用型別定義

import { Component, Vue } from "vue-property-decorator";
import { NavigationGuard } from "vue-router";

@Component
export default class MyComponent extends Vue {
  beforeRouteUpdate:NavigationGuard = function(to, from, next) {
    next();
  }
}

在vue-router/types/router.d.ts中,開頭就可以看到鉤子函式的型別定義,

export type NavigationGuard<V extends Vue = Vue> = (
  to: Route,
  from: Route,
  next: (to?: RawLocation | false | ((vm: V) => any) | void) => void
) => any

還有前面所使用到的RouterRoute,所有的方法、屬性、引數等都在這里被描述得清清楚楚

export declare class VueRouter {
  constructor (options?: RouterOptions);

  app: Vue;
  mode: RouterMode;
  currentRoute: Route;

  beforeEach (guard: NavigationGuard): Function;
  beforeResolve (guard: NavigationGuard): Function;
  afterEach (hook: (to: Route, from: Route) => any): Function;
  push (location: RawLocation, onComplete?: Function, onAbort?: ErrorHandler): void;
  replace (location: RawLocation, onComplete?: Function, onAbort?: ErrorHandler): void;
  go (n: number): void;
  back (): void;
  forward (): void;
  getMatchedComponents (to?: RawLocation | Route): Component[];
  onReady (cb: Function, errorCb?: ErrorHandler): void;
  one rror (cb: ErrorHandler): void;
  addRoutes (routes: RouteConfig[]): void;
  resolve (to: RawLocation, current?: Route, append?: boolean): {
    location: Location;
    route: Route;
    href: string;
    normalizedTo: Location;
    resolved: Route;
  };

  static install: PluginFunction<never>;
}
export interface Route {
  path: string;
  name?: string;
  hash: string;
  query: Dictionary<string | (string | null)[]>;
  params: Dictionary<string>;
  fullPath: string;
  matched: RouteRecord[];
  redirectedFrom?: string;
  meta?: any;
}

自定義三方庫宣告

當使用的三方庫未帶有 *.d.ts 宣告檔案時,在專案編譯時會報這樣的錯誤:

 Could not find a declaration file for module 'vuedraggable'. 'D:/typescript-vue-admin-demo/node_modules/vuedraggable/dist/vuedraggable.umd.min.js' implicitly has an 'any' type.
  Try `npm install @types/vuedraggable` if it exists or add a new declaration (.d.ts) file containing `declare module 'vuedraggable';`

大致意思為 vuedraggable 找不到宣告檔案,可以嘗試安裝 @types/vuedraggable(如果存在),或者自定義新的宣告檔案,

安裝 @types/vuedraggable

按照提示先選擇第一種方式,安裝 @types/vuedraggable,然后發現錯誤 404 not found,說明這個包不存在,感覺這個組件還挺多人用的(周下載量18w),沒想到社區居然沒有宣告檔案,

自定義宣告檔案

無奈只能選擇第二種方式,說實話自己也摸索了有點時間(主要對這方面沒做多了解,不太熟悉)

首先在 node_modules/@types 下創建 vuedraggable 檔案夾,如果沒有 @types 檔案夾可自行創建,vuedraggable 檔案夾下創建 index.d.ts,撰寫以下內容:

import Vue from 'vue'
declare class Vuedraggable extends Vue{}
export = Vuedraggable

重新編譯后沒有報錯,解決問題,

建議及注意事項

改造程序

  • 在接入 TypeScript 時,不必一次性將所有檔案都改為ts語法,原有的語法也是可以正常運行的,最好就是單個修改
  • 初次改造時出現一大串的錯誤是正常的,基本上都是型別錯誤,按照錯誤提示去翻譯進行修改對應錯誤
  • 在匯入ts檔案時,不需要加 .ts 后綴
  • 為專案定義全域變數后無法正常使用,重新跑一遍服務器(我就碰到過...)

遇到問題

  • 面向搜索引擎,前提是知道問題出在哪里
  • 多看仔細檔案,大多數一些錯誤都是比較基礎的,檔案可以解決問題
  • Github 找 TypeScript 相關專案,看看別人是如何寫的

寫在最后

抽著空閑時間入門一波 TypeScript,嘗試把一個后臺管理系統接入 TypeScript,畢竟只有實戰才能知道有哪些不足,以上記錄都是在 Vue 中如何使用 TypeScript,以及遇到的問題,目前作業中還未正式使用到 TypeScript,學習新技術需要成本和時間,大多數是一些中大型的公司在推崇,總而言之,多學點總是好事,學習都要多看多練,知道得越多思維就會更開闊,解決問題的思路也就越多,

參考資料

  • TypeScript入門教程
  • 技術胖-TypeScript免費視頻教程

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/162725.html

標籤:JavaScript

上一篇:案例——洗掉添加記錄

下一篇:基于Postman中的報錯

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more