主頁 > 企業開發 > vue cli4構建基于typescript的vue組件并發布到npm

vue cli4構建基于typescript的vue組件并發布到npm

2020-09-13 01:21:03 企業開發

基于vue cli創建一個vue專案

  首先安裝最新的vue cli腳手架,

  npm install --global @vue/cli

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules\@vue\cli\node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

+ @vue/[email protected]
added 1230 packages from 670 contributors in 118.122s

  查看安裝的vue -V

@vue/cli 4.4.6

   創建專案:vue create my-project-name(“my-project-name”,這個可以根據需要命名,盡量用英文)

Vue CLI v4.4.6
? Please pick a preset: Manually select features
? Check the features needed for your project: Babel, TS, Router, Vuex, CSS Pre-processors, Linter
? Use class-style component syntax? Yes
? Use Babel alongside TypeScript (required for modern mode, auto-detected polyfills, transpiling JSX)? Yes
? Use history mode for router? (Requires proper server setup for index fallback in production) Yes
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): Sass/SCSS (with node-sass)
? Pick a linter / formatter config: Prettier
? Pick additional lint features: Lint on save
? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files
? Save this as a preset for future projects? Yes
? Save preset as: ts_tmpl

  創建完成之后,會出現如下提示

?  Running completion hooks...

?  Generating README.md...

?  Successfully created project my-project-name.
?  Get started with the following commands:

 $ cd my-project-name
 $ npm run serve

  根據提示執行命令

E:\vue_codes>cd my-project-name

E:\vue_codes\my-project-name>npm run serve

> my-project-name@0.1.0 serve E:\vue_codes\my-project-name
> vue-cli-service serve

 INFO  Starting development server...
Starting type checking service...
Using 1 worker with 2048MB memory limit
98% after emitting CopyPlugin

 DONE  Compiled successfully in 5304ms                                                                      上午11:13:54

No type errors found
Version: typescript 3.9.7
Time: 3160ms

  App running at:
  - Local:   http://localhost:8080/
  - Network: http://192.168.1.95:8080/

  Note that the development build is not optimized.
  To create a production build, run npm run build.

  在瀏覽器輸入地址:http://localhost:8080/

  出現如上圖所示界面,表示專案創建成功了,

   生成的代碼目錄結構如下:

   兩個宣告檔案:shims-vue.d.tsshims.tsx.d.ts

  shims-vue.d.ts由于 TypeScript 默認并不支持 *.vue 后綴的檔案,所以在 vue 專案中引入的時候需要創建一個shims-vue.d.ts 檔案,放在專案專案對應使用目錄下,例如 src/shims-vue.d.ts,用來支持*.vue 后綴的檔案

  shims-tsx.d.ts允許.tsx 結尾的檔案,在 Vue 專案中撰寫 jsx 代碼

  tsconfig.json:typescript組態檔,主要用于指定待編譯的檔案和定義編譯選項

  normalize.css:Normalize.css 是一個可以定制的CSS檔案,它讓不同的瀏覽器在渲染網頁元素的時候形式更統一,Normalize.css是一種CSS reset的替代方案,

  .browserslistrc:這個配置能夠分享目標瀏覽器和nodejs版本在不同的前端工具,這些工具能根據目標瀏覽器自動來進行配置,Browserslist這個東西單獨是沒用的,(補充: 在vue官方腳手架中,browserslist欄位會被 @babel/preset-env 和 Autoprefixer 用來確定需要轉譯的 JavaScript 特性和需要添加的 CSS 瀏覽器前綴,)

   browserslist的組態檔:
  > 1% 兼容全球使用率大于1%的游覽器
  last 2 versions 兼容每個游覽器的最近兩個版本
  not ie <= 8 不兼容ie8及以下
  具體可見 browserslist,

  babel.config.js:Babel 是一個工具鏈,主要用于將 ECMAScript 2015+ 版本的代碼轉換為向后兼容的 JavaScript 語法,以便能夠運行在當前和舊版本的瀏覽器或其他環境中,   postcss.config.js:用于配置將px轉化成rem,和自動添加CSS瀏覽器前綴等,   esnext 是一個 JavaScript 庫,可以將 ES6 草案規范語法轉成今天的 JavaScript 語法,

改造專案結構

  這種組件專案和我們日常的專案還是有很大區別的,由于前面我采用的是vue cli創建的完整模板專案,這里許多東西用不到,我們就將其刪掉,最終專案目錄結構如下:

   examples:是組件使用示例

  src/components:是組件原始碼

  package.json代碼如下:

{
  "name": "jie-echarts",
  "version": "0.1.0",
  "private": false,
  "description": "echarts組件",
  "main": "dist/JieEcharts.common.js",
  "author": "zouqj<[email protected]>",
  "license": "MIT",
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "lib": "vue-cli-service build --target lib --name JieEcharts ./src/index.ts"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/zouyujie/vue-components/tree/master/jie-echarts"
  },
  "bugs": {
    "url": "https://github.com/zouyujie/vue-components/issues"
  },
  "homepage": "https://github.com/zouyujie/vue-components/tree/master/jie-echarts",
  "keywords": [
    "vue",
    "vuejs",
    "typescript",
    "vuecli4.x"
  ],
  "dependencies": {
    "core-js": "^3.6.5",
    "echarts": "^4.8.0",
    "ts-loader": "^8.0.1",
    "vue": "^2.6.11",
    "vue-class-component": "^7.2.3",
    "vue-property-decorator": "^8.4.2",
    "vue-router": "^3.2.0",
    "vuex": "^3.4.0"
  },
  "devDependencies": {
    "@types/echarts": "^4.6.4",
    "@typescript-eslint/eslint-plugin": "^2.33.0",
    "@typescript-eslint/parser": "^2.33.0",
    "@vue/cli-plugin-babel": "~4.4.0",
    "@vue/cli-plugin-eslint": "~4.4.0",
    "@vue/cli-plugin-router": "~4.4.0",
    "@vue/cli-plugin-typescript": "~4.4.0",
    "@vue/cli-plugin-vuex": "~4.4.0",
    "@vue/cli-service": "~4.4.0",
    "@vue/eslint-config-prettier": "^6.0.0",
    "@vue/eslint-config-typescript": "^5.0.2",
    "eslint": "^6.7.2",
    "eslint-plugin-prettier": "^3.1.3",
    "eslint-plugin-vue": "^6.2.2",
    "node-sass": "^4.12.0",
    "prettier": "^1.19.1",
    "sass-loader": "^8.0.2",
    "typescript": "~3.9.3",
    "vue-template-compiler": "^2.6.11"
  }
}

  重點注意標紅部分的配置,

  tsconfig.json

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "typeRoots": ["/@types", "./node_modules/@types"],
    "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"]
}

  vue.config.js代碼如下:

'use strict';
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const webpack = require('webpack');
const path = require('path');
const resolve = (dir) => path.resolve(__dirname, dir);
module.exports = {
  // 修改 src 目錄 為 examples 目錄
  pages: {
    index: {
      entry: 'examples/main.ts',
      template: 'public/index.html',
      filename: 'index.html',
    },
  },
  // vue 通過 file-loader 用版本哈希值和正確的公共基礎路徑來決定最終的圖片路徑,再用 url-loader 將小于 4kb 的
  // 圖片行內,以減少 HTTP 請求的數量,所以我們可以通過 chainWebpack 調整圖片的大小限制,例如,我們將
  // 圖片大小限制設定為 13kb,低于13kb的圖片全部被行內,高于13kb的圖片會放在單獨的img檔案夾中,
  chainWebpack: (config) => {
    const imagesRule = config.module.rule('images');
    imagesRule
      .use('url-loader')
      .loader('url-loader')
      .tap((options) => Object.assign(options, { limit: 13312 }));
  },
  // 設定css: { extract: false },可以強制行內,就不會將css單獨打包成一個檔案,導致頁面沒有style
  css: { extract: false },
  productionSourceMap: false,
};

  說明:UglifyJS Webpack Plugin插件用來縮小(壓縮優化)js檔案,修改應用入口檔案,examples/main.ts,方便執行npm run serve的時候,可以直接查看組件的示例,

 .npmignore可以將一些不需要發布到npm的檔案忽略掉,.npmignore配置如下:

.*
package-lock.json
/.git/
/.vscode/
tslint.json
tsconfig.json
*.log

.DS_Store
/dist
/examples
/node_modules
/public
/src
/tests
.browserslistrc
jest.config.js
vue.config.js

# local env files
.env.local
.env.*.local

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Editor directories and files
.idea
.vscode
.gitignore
.npmignore
.npmrc
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

  components下面

  index.ts代碼,以插件的形式進行封裝,方便全域參考:

import jieEcharts from './jie-echarts.vue';

(jieEcharts as any).install = (Vue: any) => {
  Vue.component(jieEcharts.name, jieEcharts);
};

export default jieEcharts;

  jie-echarts.vue,是組件原始碼,代碼:

<template>
  <!-- 每一個圖表都有自己唯一的id,需要動態傳入, -->
  <div :ref="id" :id="id" : :style="style" />
</template>
<script lang="ts">
import { Component, Vue, Prop, Watch } from "vue-property-decorator";
import Echarts from "echarts";
@Component({
  name: "jie-echarts"
})
export default class extends Vue {
  @Prop({ default: "myCharts" }) private id!: string;
  @Prop({ default: "100%" }) private width!: string;
  @Prop({ default: "200px" }) private height!: string;
  @Prop({ default: "echarts-line" }) private myclass!: string;
  @Prop() private options!: object;
  @Prop({ default: false }) private loading!: boolean;

  private MyEcharts: any = null; // echarts實體

  created() {
    console.log("this.options :>> ", this.options);
  }
  mounted() {
    this.InitCharts();
  }

  get style() {
    return {
      height: this.height,
      width: this.width
    };
  }
  @Watch("options", { deep: true })
  onChangeOption(newVal: string, oldVal: string) {
    if (this.MyEcharts) {
      if (newVal) {
        // console.log(JSON.stringify(newVal))
        this.MyEcharts.setOption(newVal, true);
      } else {
        this.MyEcharts.setOption(oldVal, true);
      }
      setTimeout(() => {
        this.MyEcharts.resize();
      });
    } else {
      this.InitCharts();
    }
  }
  @Watch("height")
  onChangeHeight(val: string) {
    if (val) {
      this.height = val;
    }
    if (this.MyEcharts) {
      this.MyEcharts.setOption(this.options, true);
    } else {
      this.InitCharts();
    }
  }
  @Watch("loading")
  onChangeLoading(val: boolean) {
    if (val == true) {
      this.showLoading();
    }
    if (val == false) {
      this.hideLoading();
    }
  }
  //-----------------------method----------------------
  // 組件初始化
  private InitCharts() {
    const dom: any = this.$refs[this.id] as HTMLDivElement; // document.getElementById(this.id);
    this.MyEcharts = Echarts.init(dom);
    if (this.loading == true) {
      this.showLoading();
    }
    /**
     * 此方法適用于所有專案的圖表,但是每個配置都需要在父組件傳進來,相當于每個圖表的配置都需要寫一遍,不是特別的省代碼,主要是靈活度高
     * echarts的配置項,你可以直接在外邊配置好,直接扔進來一個this.option
     */
    this.MyEcharts.clear(); // 適用于大資料量的切換時圖表繪制錯誤,先清空在重繪
    this.MyEcharts.setOption(this.options, true); // 設定為true可以是圖表切換資料時重新渲染
    setTimeout(() => {
      this.MyEcharts.resize();
    });
    // 當視窗變化時隨瀏覽器大小而改變
    window.addEventListener("resize", () => {
      this.MyEcharts.resize();
    });
    this.MyEcharts.on("click", (params: any) => {
      this.mapClick(params);
    });
  }
  //組件單擊事件
  private mapClick(params: any) {
    // console.log(params, 999999);
    const data =https://www.cnblogs.com/jiekzou/p/ {
      color: params.color,
      data: params.data,
      dataIndex: params.dataIndex,
      seriesIndex: params.seriesIndex,
      chartType: params.componentSubType
    };
    this.$parent.$emit("chartParams", JSON.stringify(data));
    if (params.seriesType == "map") {
      this.$emit("mapValue", params.name);
    } 
      this.$emit("eclick", params);
  }
  private showLoading() {
    if (this.MyEcharts) {
      this.MyEcharts.showLoading({
        text: "loading"
        // color: '#4cbbff',
        // textColor: '#4cbbff',
      });
    }
  }
  private hideLoading() {
    if (this.MyEcharts) {
      this.MyEcharts.hideLoading();
    }
  }
  beforeDestroy() {
    window.removeEventListener("resize", () => {
      this.MyEcharts.resize();
    });
  } } </script> <style lang="scss" scoped> .echarts-line { height: 100%; } </style>

  @types目錄下:

  component.d.ts代碼:

import Vue from 'vue';

export class VanComponent {
  static name: string;
  static install(vue: typeof Vue): void;
}

  說明:@types是npm的一個分支,當我們把npm包發上去,npm包就會托管到服務器,供大家下載,但是ts為了代碼的可復用性,要申明一些靜態型別檔案,那些檔案就是*.d.ts

  shims-vue.d.ts代碼:

declare module "*.vue" {
  import Vue from "vue";
  export default Vue;
}

  App.vue,組件引入演示界面,代碼:

<template>
  <div id="app">
    <jie-echarts :options="echartsOptions"></jie-echarts>
  </div>
</template>
<script lang="ts">
import { Component, Vue, Watch, Prop } from "vue-property-decorator";
import jieEcharts from "../src/index";
@Component({
  components: {
    jieEcharts
  }
})
export default class TestJieEchartsPreview extends Vue {
  protected echartsOptions = {
    xAxis: {
      type: "category",
      data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
    },
    yAxis: {
      type: "value"
    },
    series: [
      {
        data: [820, 932, 901, 934, 1290, 1330, 1320],
        type: "line"
      }
    ]
  };
}
</script>
<style lang="scss">
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

#nav {
  padding: 30px;

  a {
    font-weight: bold;
    color: #2c3e50;

    &.router-link-exact-active {
      color: #42b983;
    }
  }
}
</style>

  執行npm run serve,運行結果如下:

發布到NPM

  1.去https://www.npmjs.com/注冊一個賬號   2.登錄郵箱,點擊激活連接

  3.執行npm login,進行登錄

PS E:\vue_codes\my-project-name> npm login
Username: zouyujie
Password:
Email: (this IS public) [email protected]

  如果你是使用的淘寶鏡像,注意啊要先切換到npm官網鏡像,切換方式:npm config set registry https://registry.npmjs.org/

  4.執行命令 npm publish,進行發布,如果出現如下圖所示錯誤:

   說明郵箱沒有系結成功,點擊https://www.npmjs.com/email-edit,進行系結,然后重新執行npm publish,運行結果如下:

PS E:\vue_codes\my-project-name> npm publish
npm notice 
npm notice package: [email protected]
npm notice === Tarball Contents ===
npm notice 632B    dist/index.html
npm notice 4.3kB   dist/favicon.ico
npm notice 66B     babel.config.js
npm notice 965.0kB dist/js/chunk-vendors.80f39f1d.js
npm notice 6.3kB   dist/js/index.f9222971.js
npm notice 1.4kB   package.json
npm notice 327B    README.md
npm notice === Tarball Details ===
npm notice name:          jie-echarts
npm notice version:       0.1.0
npm notice package size:  341.3 kB
npm notice unpacked size: 978.0 kB
npm notice shasum:        2b65bfa887ba4677dc95a36a4b0403ebfecc9fde
npm notice integrity:     sha512-RwSE3lC8N3wZT[...]b1b9cvJ8UtL/w==
npm notice total files:   7
npm notice
+ [email protected]

  至此,npm發布成功,

  然后我們去npm上,查看我們發布的npm包,

   如果能看到如下圖所示界面:

   說明已發布成功,

  注意:每次重新發布都要記得修改一下版本號,否則會發布失敗,發布成功后,你的npm郵箱都會受到一封npm組件發布成功的郵件通知,

  npm上地址:https://www.npmjs.com/package/jie-echarts

安裝jie-echarts

     npm i jie-echarts

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

標籤:JavaScript

上一篇:DDOS和DOS區別

下一篇:vlan的配置

標籤雲
其他(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