主頁 > 企業開發 > 「AntV」X6開發實踐:踩過的坑與解決方案

「AntV」X6開發實踐:踩過的坑與解決方案

2023-06-08 09:09:13 企業開發

長期更新版檔案請移步語雀(「AntV」X6開發實踐:踩過的坑與解決方案 (yuque.com))

??? | 如何自定義拖拽源?

相信你們在開發中更多的需求是需要自定義拖拽源,畢竟自定義的功能擴展性高一些,而且可以根據你的業務需求靈活設定,自定義拖拽的優點就是:萬物皆可成為拖拽源,不管你使用的是html標簽,還是第三方的ui框架,或者樹形串列,……這些都可以設定成拖拽源,只有你想不到的,沒有官方做不到的,來吧,開整,

官方提供的拖拽

image.png

自定義的拖拽

image.png

解決方案

這里使用的是Dnd插件,因為我看官方介紹說Stencil插件內部也是依靠Dnd實作的,索性就直接使用Dnd來搞吧

步驟1:初始化Dnd

// 先定義個全域的dnd變數
let dnd = null;
// 在mounted中對dnd進行初始化(在graph之后初始化)
dnd = new Dnd({
  target: graph,
  scaled: false,
  dndContainer: proxy.$refs.dndContainer
});

步驟2:定義拖拽事件

/**
 * 自定義拖拽源事件
 * @param {*} e
 * @param {*} treeNode 根據需要傳入要添加的引數
 * @param {*} data 根據需要傳入要添加的引數
 * 這里使用的是elementPlus的tree組件
 */
const startDrag = (e, treeNode, data) => {
  console.log('eee', e);
  console.log('treeNode', treeNode);
  console.log('data', data);
  const node = graph.createNode({
    shape: 'cu-data-node',
    width: 150,
    height: 104,
    label: data?.label,
	// 傳遞給自定義節點的資料
    data: {
      label: data?.label,
      img: data?.img,
      desc: data?.desc
    },
    ports: {
      ...port,
      items: [
        {
          group: 'top'
        }
      ]
    }
  });
  dnd.start(node, e);
};

步驟3:自定義html節點

  // 注冊自定義節點 圖示+標題+描述
  Shape.HTML.register({
    shape: 'cu-data-node',
    width: 'auto',
    height: 104,
    effect: ['data'],
    html(cell) {
      // 獲取節點傳遞過來的資料
      const { label, img, desc } = cell.getData();
      // 創建自定義的節點容器
      const container = document.createElement('div');
      container.setAttribute('class', 'cu-container');
      // 圖片根據不同的型別進行切換,可以是后端回傳的圖示,也可以是自己本地的圖示,如果是后端回傳就通過節點的data傳進來
      const container_img = document.createElement('img');
      container_img.src = https://www.cnblogs.com/sxdpanda/archive/2023/06/07/currentTab.value === 0 ?'/src/assets/images/operator/datasouce.png' : img;
      container_img.setAttribute('class', 'cu-container-img');


      const container_title = document.createElement('div');
      container_title.innerText = label;
      container_title.setAttribute('class', 'cu-container-title');


      const container_desc = document.createElement('div');
      container_desc.setAttribute('class', 'cu-container-desc');
      container_desc.innerText = desc || '描述資訊';


      container.appendChild(container_img);
      container.appendChild(container_title);
      container.appendChild(container_desc);


      return container;
    }
  });

步驟4:元素系結拖拽事件

<!-- $event必傳,后面的引數根據你的業務需求動態添加 -->
<div  @mousedown="startDrag($event, node, data)">拖拽的節點</div>

??? | 本地圖片匯出后不顯示?

先看看官方的匯出檔案:
圖片匯出

由于業務需要,需要把畫布上的節點保存成圖片供其它模塊展示,如果你的后端回傳的資料格式是前端想要的,那么大不必搞圖片的形式,直接把官網的快速上手代碼拿過來回圈一下就好了……,這里就拿toPng的方法來講解

問題梳理

  • 呼叫toPng拿到畫布的base64資料
  • 把base64的資料傳給后端
  • 后端把base64的資料轉存后生成可訪問的圖片地址再回傳給前端
  • 前端開始展示

然而事情卻沒有這么簡單,第一步就遇到了一堆的坑,由于官網上匯出的都是它內置的節點,所以匯出都沒啥問題,但是我使用的是html節點,匯出的時候,我節點的圖片就死活導不出來,而且匯出的樣式也是亂的(樣式錯亂問題)

解決方案

一句話:圖片必須得是base64格式的匯出才會有圖片,不然無法匯出節點的圖片

  1. 自定義html節點中把圖片轉換成base格式的

需要呼叫 imageToDataUri把圖片地址轉成base64的資料,這個方法我也是摸索了好久才找到的,官方檔案完全沒有提及這個方法,如果需要查看其它方法,請列印 DataUri這個物件

DataUri.imageToDataUri('/images/operator/datasouce.png',
  function (nu, url) {
    // 第一個引數無效,用的只是第二個引數,但是第一個引數不寫不行
    container_img.src = https://www.cnblogs.com/sxdpanda/archive/2023/06/07/url; // 給圖片標簽賦值
  }
);
  1. 呼叫toPng生成base64資料

這個步驟中要處理的問題:匯出后樣式不正確,匯出的時候頁面閃動

graph.toPNG(
  dataUri => {
    console.log('dataUri >>>>', dataUri); // 這個就是base的圖片地址
  },
  {
    width: 526,
    height: 268,
    backgroundColor: 'rgba(25, 87, 121, 0.18)',
    quality: 1, // 圖片質量 取值范圍:0-1,默認0.92
    // copyStyles: false,
    // 自定義樣式表,為了解決匯出后節點樣式丟失的問題,暫時官方還沒有修復這個bug
    stylesheet: `
      .cu-container {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      }
      .cu-container-title {
      color: #d3e6f3;
      }
      .cu-container-img {
      width: 53px;
      height: 53px;
      margin-bottom: 4px;
      }
      .cu-container-desc {
      color: rgba(211, 230, 243, 0.7);
      margin-top: 3px;
      }
      .cu-container-title,
      .cu-container-desc {
      font-size: 14px;
      font-weight: 400;
      line-height: 20px;
      display: -webkit-box;
      -webkit-box-orient: vertical;
      -webkit-line-clamp: 1;
      }
    `
  }
);

:::warning
Tip:圖片匯出樣式和原節點的樣式不一致問題:如果你遇到了這個問題,目前最好的方法是不斷調整stylesheet中的樣式,直到匯出的樣式和原節點的樣式幾乎一致即可,當然,如果你的甲方不重視頁面互動,咱們完全可以使用copyStyles:true這個屬性就行了,這樣就不用設定 stylesheet
:::


??? | 神奇的圖片邊框

:::tips
昨天才把html節點中的圖片轉成base格式的,今天就發現一個用戶體驗的問題;那么是啥呢?就是我從左側的樹形選單中拖拽節點的時候(滑鼠按下也是同樣問題),發現節點的圖片區域那里會出現一個邊框,持續時間不是很長,就幾毫秒的時間,但是當你連續拖拽幾個不同節點的時候就會發現這個邊框竟然又消失不見了,如果此時重新進入頁面,再開始拖動節點,圖片的邊框又出現了,
:::

問題梳理

  • 是否是官方節點自帶的邊框?如果是,配置項是什么?
  • 圖片的默認邊框是否被清除?還是外圍元素的邊框導致?
  • 圖片的加載時機?
  • 是否是轉base64的問題,畢竟在這之前沒有這個情況發生……
    :::tips
    帶著這些問題,第一時間去翻閱了官方檔案,發現沒有和這個問題相關的配置項,即使有設定了也不管用;然后就把問題拋到了交流群里面,發現壓根沒人回答……,那就只能開始第二個方案了:把圖片的默認邊框都去除掉,比如border,box-shadow,outline這些屬性都去除掉了,發現還是沒用;好吧,開始第三套方案:使用new Image處理圖片的加載時機問題,嗯!不出意外的話,這個方法還是不行
    :::

定位問題

經過上面四個方案的嘗試后,我大概知道了問題的源頭在哪邊了,那就是我自定義html節點中圖片地址賦值的地方,由于DataUri.imageToDataUri 這個方法是個異步執行的,所以才會導致在渲染的時候會出現短暫的視覺差

解決方案

  • 先給圖片賦值個普通的地址(非base64的地址)
  • DataUri.imageToDataUri('隨便寫個引數名',url)的回呼中再把圖片的src替換成base64的
const container_img = document.createElement('img');
container_img.setAttribute('class', 'cu-container-img');
container_img.setAttribute('alt', '節點ico');
container_img.style.cursor = 'pointer';
// 先用遠程圖片地址給圖片的src賦值,然后再重新賦值成base64的格式;這么做的目的就是解決節點拖拽到畫布上會出現短暫的邊框閃動問題,如果你要復現這個邊框,可以把下面這一行代碼注掉(不是必現)
container_img.src = https://www.cnblogs.com/sxdpanda/archive/2023/06/07/img;
// 把圖片轉成base64方便存盤到后端
DataUri.imageToDataUri(img, function (nu, url) {
// 第一個引數無效,用的只是第二個引數,但是第一個引數不寫由不行
container_img.src = url;
});

??? | 畫布內容從介面獲取資料后無法居中?

場景

前端需要把畫布上的節點保存到后端,然后前端在獲取詳情介面的時候要把節點進行居中處理

問題梳理

在不呼叫后端介面的情況下使用centerContent()是沒得問題的;但是在動態獲取節點資料后就會存在異步加載的問題,也就是先將內容居中了,之后再設定節點到畫布中去,此時centerContent的時機已經過去了,節點還是更具自身的位置進行排列

解決方案

由于作者用的vue技術堆疊,所以這里的解決方法主要以vue為主

方案1:使用nextTick等待dom全部渲染完成

nextTick(() => {
	graph.centerContent();
});

方案2:直接在介面中使用

getDataView({ size: -1, name: item.tableMetaName }).then(res => {
    if (res.code === 0) {
      // 縮放
      graph.zoom(-0.1);
      // 畫布居中
      graph.centerContent();
    }
});

??? | 自定義右鍵選單坐標不準確?

問題梳理

原本的寫法是節點右鍵的時候通過node.position()的方法獲取節點的坐標,然后再把節點的坐標綁到右鍵選單的dom上,但是發現對畫布進行平移的時候,右鍵選單的位置還停留在第一次的位置,原因就是畫布平移和節點沒啥關系,節點的坐標并不會因為畫布平移了就自動更改自身的坐標

解決方案

對滑鼠的坐標進行轉換,這也是1.9版本中新增的一個方法,關鍵是在官方檔案中還找不到這個方法,只能死馬當活馬醫了 坐標轉換,果然問題解決了

graph.on('node:contextmenu', ({ e, node }) => {
  const pos = graph.clientToGraph(e.clientX, e.clientY);// 核心代碼就是這一行
  createMenuDom({ x: pos.x, y: pos.y, node, type: 0 });
});

附:自定義右鍵選單完整代碼

這里需要對javascript的dom有點基礎,不過這只是我創建dom的方法,如果你們想用其它的方法也是可以的哈

let divMenuContainer = null;
const createMenuDom = ({ x, y, node, edge, type }) => {
  if (divMenuContainer) {
    // 如果存在了選單,就先移除再創建,不然你的頁面上會多出來好多選單的
    document.getElementById('container').removeChild(divMenuContainer);
  }
  divMenuContainer = document.createElement('div');
  divMenuContainer.setAttribute('class', 'div-menu-container');
  divMenuContainer.style.left = x + 30 + 'px';
  divMenuContainer.style.top = y + 'px';
  const divMenuItem = document.createElement('div');
  divMenuItem.setAttribute('class', 'div-menu-item');
  divMenuItem.innerText = type === 0 ? '洗掉節點' : '洗掉邊';
  divMenuItem.addEventListener('click', () => {
    type === 0 ? graph.removeNode(node) : graph.removeEdge(edge);
    divMenuContainer.style.display = 'none';
  });
  divMenuContainer.appendChild(divMenuItem);
  document.getElementById('container').appendChild(divMenuContainer);
  document.body.addEventListener('click', () => {
    if (divMenuContainer) {
      divMenuContainer.style.display = 'none';
    }
  });
};
graph.on('node:contextmenu', ({ e, node }) => {
  // 坐標轉換
  const pos = graph.clientToGraph(e.clientX, e.clientY);
  // 呼叫創建dom的方法,把坐標和節點資訊傳遞進去
  createMenuDom({ x: pos.x, y: pos.y, node, type: 0 });
});

效果圖

image.png


??? | 在歷史記錄中忽略某個屬性的修改

常見問題
也是下面這個問題的解決方案
image.png
這是官方的demo
連線 undo - CodeSandbox

history插件配置

new Graph({
  history: {
    enabled: true,
    beforeAddCommand(event, args: any) {
      // 忽略歷史變更
      if (args.options.ignoreHistory) {
        return false
      }
    },
  },
})

邊的寫法

graph.on('edge:connected', ({ edge }) => {
   // 傳入自定義的 ignoreHistory 選項來忽略歷史變更
   edge.attr('line/strokeDasharray', null, { ignoreHistory: true })
})

節點的寫法

new History({
  enabled: true,
  beforeAddCommand(event, args) {
    if (args.options.ignoreHistory) {
      return false;
    }
  }
})
node.setData({ tableMeta: res.data.records, desc: res?.data?.records?.length || 0 }, { ignoreHistory: true });

??? | x和y坐標為字串報錯問題

解決方案

直接把x,y坐標轉成純數字的即可,不然拖動節點的時候會報錯的


??? | 設定節點移動范圍在畫布內

Transform

new Graph({
  translating: {
  restrict: true
}
})

??? | 獲取當前節點的所有父級節點

此方法會回傳所有的輸入和輸出邊,如果只要輸入邊的節點或者輸出邊的節點資訊,請看這里鏈接

const getParentNodes = node => {
  const nodeId = node.id;
  const connectedNodes = [];
  // 如果需要其他方法,請看下方的具體配置,根據自己的需要修改這里的代碼即可
  const edges = graph.getConnectedEdges(node, { deep: true });
  for (const edge of edges) {
    const sourceNode = edge.getSourceNode();
    const targetNode = edge.getTargetNode();
    if (sourceNode.id !== nodeId) {
      connectedNodes.push(sourceNode);
    }
    if (targetNode.id !== nodeId) {
      connectedNodes.push(targetNode);
    }
  }
  return connectedNodes;
};

// 具體的配置
const edges = graph.getConnectedEdges(node) // 回傳輸入和輸出邊
const edges = graph.getConnectedEdges(node, { incoming: true, outgoing: true }) // 回傳輸入和輸出邊

const edges = graph.getConnectedEdges(node, { incoming: true }) // 回傳輸入邊
const edges = graph.getConnectedEdges(node, { incoming: true, outgoing: false }) // 回傳輸入邊

const edges = graph.getConnectedEdges(node, { outgoing: true }) // 回傳輸出邊
const edges = graph.getConnectedEdges(node, { incoming:false, outgoing: true }) // 回傳輸出邊

const edges = graph.getConnectedEdges(node, { deep: true }) // 回傳輸入和輸出邊,包含鏈接到所有子孫節點/邊的輸入和輸出邊
const edges = graph.getConnectedEdges(node, { deep: true, incoming: true }) // 回傳輸入邊,包含鏈接到所有子孫節點/邊的輸入邊
const edges = graph.getConnectedEdges(node, { deep: true, enclosed: true }) // 回傳輸入和輸出邊,同時包含子孫節點/邊之間相連的邊

const edges = graph.getConnectedEdges(node, { indirect: true }) // 回傳輸入和輸出邊,包含間接連接的邊

??? | 注冊自定義節點報錯?

報錯資訊

(in promise) Error: Node with name 'cu-port' already registered.

下面這個報錯是群友發的,但是問題和我之前遇到的是一類問題,所以就直接告訴群友問題所在了??
image.png

錯誤代碼

Graph.registerNode(name,options)

正確代碼

Graph.registerNode(name,options,true)


??? | 常用方法集錦

  1. 清慷訓布:graph.clearCells()
  2. 畫布縮小:graph.zoom(-0.5)
  3. 獲取畫布縮放比例:graph.zoom()
  4. 獲取畫布上所有節點:graph.getNodes()
  5. 獲取畫布上所有邊:graph.getEdges()
  6. 設定節點移動范圍在畫布內鏈接
translating: {
  restrict: true
},
  1. 動態設定節點位置鏈接:node.position(x,y)
  2. 節點只能被相同的源節點連接一次鏈接:allowMulti: false
  3. 兩個節點連接的時候獲取目標節點的資料鏈接
graph.on('edge:connected', ({ isNew, edge, currentCell }) => {
  // 回呼的引數:https://antv-x6.gitee.io/zh/docs/tutorial/intermediate/events/#%E8%BE%B9%E8%BF%9E%E6%8E%A5%E5%8F%96%E6%B6%88%E8%BF%9E%E6%8E%A5
  console.log('被連接的節點詳細引數', currentCell);
  if (currentCell.data['type'] === 0) {
    proxy.$modal.msgError('資料源無法作為輸出節點');
    // 移除連接的邊
    graph.removeEdge(edge?.id);
  }
});
  1. 判斷當前節點是否被連接鏈接
const node = graph.getCellById('node1')
const connectedEdges = graph.getConnectedEdges(node)

附:參考檔案
Dnd插件
Stencil插件
圖片匯出
1.x常見問題
坐標轉換
Transform
Model

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

標籤:其他

上一篇:JS基礎語法(一)

下一篇:返回列表

標籤雲
其他(160580) Python(38215) JavaScript(25484) Java(18209) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7235) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4585) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1983) 功能(1967) HtmlCss(1955) Web開發(1951) C++(1933) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1879) .NETCore(1863) 谷歌表格(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
最新发布
  • 「AntV」X6開發實踐:踩過的坑與解決方案

    長期更新版檔案請移步語雀([「AntV」X6開發實踐:踩過的坑與解決方案 (yuque.com)](https://www.yuque.com/sxd_panda/antv/x6)) ## 🖼? | 如何自定義拖拽源? > 相信你們在開發中更多的需求是需要自定義拖拽源,畢竟自定義的功能擴展性高一些 ......

    uj5u.com 2023-06-08 09:09:13 more
  • JS基礎語法(一)

    javascript簡介 javascrpit是是一種輕量級的編程語言,常用于web前端開發。另外js還可以用來寫node.js型別的服務和工具,在測驗web專案的時候需要了解。 變數 js定義變數有3種方式:var、const、let,3者的區別: 在 2015 年以前,使用 var 關鍵字來宣告 ......

    uj5u.com 2023-06-08 09:09:09 more
  • vue常見自定義指令

    在 Vue2.0中,代碼復用和抽象的主要形式是組件。然而,有的情況下,你仍然需要對普通 DOM元素進行底層操作,這時候就會用到自定義指令。你可以將一些 css樣式抽象到指令中,也可以將一些 js 操作放到指令中去執行。就使用上來說,指令不用像組件一樣需要引入和注冊,注冊后使用非常簡潔方便。對于在專案... ......

    uj5u.com 2023-06-08 09:09:05 more
  • Vue3從入門到精通(一)

    Vue3簡介 Vue3是Vue.js的最新版本,于2020年9月18日正式發布。Vue3相比Vue2有很多改進和優化,包括但不限于: 更快的渲染速度:Vue3通過使用Proxy代理物件和優化虛擬DOM演算法等方式,提高了渲染性能。 更小的體積:Vue3的體積比Vue2更小,打包后的檔案更小,加載速度更 ......

    uj5u.com 2023-06-08 09:08:59 more
  • 前端 & 設計師常用圖示資源庫

    # 1. Iconfont * 阿里傾力打造的矢量圖示管理、交流平臺,設計師將圖示上傳到 iconfont 平臺,用戶可以自定義下載多種格式的icon,平臺也可將圖示轉換為字體,便于前端工程師自由調整與呼叫。 * 地址:Iconfont ![](https://img2023.cnblogs.com ......

    uj5u.com 2023-06-08 09:01:50 more
  • 一定要看的前端codeReview規范指南

    一、前言 針對目錄結構、CSS規范、JavaScript規范、Vue規范 可參照官方給出的 [風格指南](https://v2.cn.vuejs.org/v2/style-guide/index.html) 這里主要總結業務開發中常遇到的代碼問題和實踐,幫助大家后續各自做好codeReview,一些 ......

    uj5u.com 2023-06-08 08:50:46 more
  • h5移動端頁面除錯工具Chii與 weinre 一樣的遠程除錯工具

    與 weinre 一樣的遠程除錯工具,主要是將 web inspector 替換為最新的 chrome devtools frontend. 電腦上跑一個chii服務,把對應的js嵌入h5頁面內,用手機訪問h5頁面,chrome內看chii服務地址即可找到對應管理控制臺 安裝 可以通過 npm 安裝 ......

    uj5u.com 2023-06-08 08:50:40 more
  • 使用THREEJS實作一個可調節檔位、可搖頭的電風扇

    夏天到了,用Three.js實作一個可以搖頭和調節檔位的電風扇。主要使用到Blender處理3D模型,用Vite+Typescript搭建專案框架。 ......

    uj5u.com 2023-06-08 08:50:18 more
  • 深圳前端一年半,投了兩個月簡歷,第一場面試

    ## 背景 > base深圳,一年半經驗,找的初級前端崗位,1-3年,投簡歷兩個月只有兩個面試,這是第一個面試 ## 一面 ### 你對html元素是怎么分類的? 一開始我愣了一下?搞這么簡單的問題???后面又問面試官你是指的id選擇器這些嗎,,還是display:block,inline-bloc ......

    uj5u.com 2023-06-08 08:50:03 more
  • Webpack 插件實作 CSS 樣式尺寸單位轉換

    # Webpack 插件實作 CSS 樣式尺寸單位轉換 ## 實作方式一 ### 插件代碼 以下是撰寫的一個 Webpack 插件,用于將樣式檔案中以 rpx 為單位的值轉換為以 px 為單位的值(換算比率為 1px=2rpx): ```javascript const pluginName = " ......

    uj5u.com 2023-06-08 08:49:59 more