文轉載自微信公眾號「全棧修仙之路」,作者阿寶哥。轉載本文請聯系全棧修仙之路公眾號。
在日常工作中,文件上傳是一個很常見的功能。在上傳文件時,我們可以選擇上傳單個文件,也可以通過設置 multiple 屬性來上傳多個文件。
本文阿寶哥將介紹如何上傳目錄及如何壓縮目錄并上傳,壓縮目錄的功能是通過 JSZip 這個庫來實現。利用這個庫還可以實現在線預覽 ZIP 文件的功能,感興趣的小伙伴可以閱讀 JavaScript 如何在線解壓 ZIP 文件? 這篇文章。下面我們先來介紹如何實現壓縮目錄并上傳的功能。
1.1 選擇目錄
在瀏覽器端,要實現壓縮目錄并上傳的功能。首先我們要先實現選擇目錄的功能,要實現該功能,我們可以直接使用 HTMLInputElement 元素的 webkitdirectory 屬性:
<input type="file" id="uploadFile" webkitdirectory />
當設置了 webkitdirectory 屬性之后,我們就可以選擇目錄了。當阿寶哥選擇了 useAxios 目錄之后,就會顯示以下確認框:
點擊上傳按鈕之后,我們就可以獲取文件列表。列表中的文件對象上含有一個 webkitRelativePath 屬性,用于表示當前文件的相對路徑。在進行目錄壓縮的時候,我們就會使用到該屬性。
雖然通過 webkitdirectory 屬性可以很容易地實現選擇目錄的功能,但在實際項目中我們還需要考慮它的兼容性。比如在 IE 11 以下的版本就不支持該屬性,其它瀏覽器的兼容性如下圖所示:
(圖片來源 —— https://caniuse.com/?search=webkitdirectory)
1.2 壓縮目錄
在 JavaScript 如何在線解壓 ZIP 文件? 這篇文章中,阿寶哥介紹了在瀏覽器端如何使用 JSZip 這個庫實現在線解壓 ZIP 文件的功能。JSZip 這個庫除了可以解析 ZIP 文件之外,它還可以用來創建和編輯 ZIP 文件。這里阿寶哥基于 JSZip 庫提供的 API,封裝了一個 generateZipFile 函數:
function generateZipFile(
zipName, files,
options = { type: "blob", compression: "DEFLATE" }
) {
return new Promise((resolve, reject) => {
const zip = new JSZip();
for (let i = 0; i < files.length; i++) { // 添加目錄中包含的文件
zip.file(files[i].webkitRelativePath, files[i]);
}
zip.generateAsync(options).then(function (blob) { // 生成zip文件
zipName = zipName || Date.now() + ".zip";
const zipFile = new File([blob], zipName, {
type: "application/zip",
});
resolve(zipFile);
});
});
}
在以上代碼中,我們使用 file(name, data [,options]) 方法,把目錄中的文件依次添加到 zip 對象中,然后再通過 generateAsync 方法來生成 ZIP 文件。在生成 ZIP 文件時,我們可以設置該文件的類型。這里我們設置的默認類型為 blob 類型,除了支持 blob 類型之外,它還支持 base64、uint8array 和 arraybuffer 等類型。
1.3 上傳壓縮 ZIP 文件
在壓縮目錄生成 ZIP 文件之后,我們就可以通過 XMLHttpRequest 或 fetch API 來上傳壓縮文件。下面阿寶哥將以 axios 為例,來實現文件上傳的功能。
html 代碼
<input type="file" id="uploadFile" webkitdirectory />
<button id="submit" onclick="uploadFile()">上傳文件</button>
js 代碼
const uploadFileEle = document.querySelector("#uploadFile");
const uploadOptions = { needZip = true };
const request = axios.create({
baseURL: "http://localhost:3000/",
timeout: 5000,
});
async function uploadFile({ needZip } = uploadOptions) {
if (!uploadFileEle.files.length) return;
let fileList = uploadFileEle.files;
if (needZip) { // 對目錄進行ZIP壓縮
let webkitRelativePath = fileList[0].webkitRelativePath;
let zipFileName = webkitRelativePath.split("/")[0] + ".zip";
fileList = [await generateZipFile(zipFileName, fileList)];
}
uploadFiles({ // 上傳文件列表
url: "/upload/multiple",
files: fileList,
});
}
在 uploadFile 函數中,如果有啟用目錄壓縮功能,我們就會調用 generateZipFile 函數生成 ZIP 文件,如果沒有的話,就會直接調用 uploadFiles 函數來上傳目錄中的所有文件,當然你也可以對文件列表進行過濾,比如限制文件類型或文件的大小等。
下面我們來看一下 uploadFiles 函數的具體實現:
function uploadFiles({ url, files, fieldName = "file" }) {
if (!url || !files.length) return;
let formData = new FormData();
for (let i = 0; i < files.length; i++) {
formData.append(fieldName, files[i], files[i].name);
}
return request.post(url, formData);
}
在 uploadFiles 函數中,我們通過創建 FormData 對象來保存文件的信息,然后通過 request(axios 實例)來執行上傳操作。
2.1 接收 ZIP 文件
在服務端要實現文件上傳功能也比較簡單,這里阿寶哥以 koa 為例來實現文件上傳的功能。如果你對 koa 還不了解的話,建議你先大致瀏覽一下 koa 的官方文檔。
const path = require("path");
const Koa = require("koa");
const cors = require("@koa/cors");
const multer = require("@koa/multer");
const Router = require("@koa/router");
const app = new Koa();
const router = new Router();
const UPLOAD_DIR = path.join(__dirname, "/public/upload");
const storage = multer.diskStorage({
destination: async function (req, file, cb) { // 設置文件的存儲目錄
cb(null, UPLOAD_DIR);
},
filename: function (req, file, cb) { // 設置文件名
cb(null, `${file.originalname}`);
},
});
const multerUpload = multer({ storage });
router.get("/", async (ctx) => {
ctx.body = "壓縮文件目錄上傳示例(阿寶哥)";
});
router.post(
"/upload/multiple",
multerUpload.fields([
{
name: "file",
},
]),
async (ctx, next) => {
ctx.body = {
status: "success",
msg: "文件上傳成功",
};
}
);
// 注冊中間件
app.use(cors());
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000, () => {
console.log("app starting at port 3000");
});
在以上代碼中,我們通過 @koa/multer 這個中間件來處理文件上傳,對該中間件感興趣的小伙伴,可以自行閱讀官方文檔。接下來,我們來繼續討論另一個問題 —— 如何接收目錄并按照文件目錄結構進行存放?
2.2 接收文件目錄
前面我們已經知道,當 input[type="file"] 使用了 webkitdirectory 屬性之后,返回 File 對象的 webkitRelativePath 屬性就會存放當前文件相對于當前目錄的相對路徑:
因此當我們在服務端處理文件目錄上傳的功能時,我們就可以通過該屬性來創建對應的目錄結構,具體的處理邏輯如下所示:
const fse = require("fs-extra");
const storage = multer.diskStorage({
destination: async function (req, file, cb) {
// 把useAxios@demo.vue中的@替換為路徑分隔符
let relativePath = file.originalname.replace(/@/g, path.sep);
let index = relativePath.lastIndexOf(path.sep);
let fileDir = path.join(UPLOAD_DIR, relativePath.substr(0, index)); // 生成文件路徑
await fse.ensureDir(fileDir); // 確保當前目錄存在
cb(null, fileDir);
},
filename: function (req, file, cb) {
let parts = file.originalname.split("@"); // 對路徑進行拆分
cb(null, `${parts[parts.length - 1]}`); // 獲取文件名
},
});
為什么 originalname 文件原始名稱會包含 @ 符號呢?這樣因為使用 useAxios/demo.vue 這種路徑形式時,是不能獲取到完整的路徑名稱,只能獲取到文件名。為了解決這個問題,阿寶哥在上傳文件時,手動把文件相對路徑中的 / 符號替換為 @ 然后再進行上傳,對應的處理邏輯如下:
function uploadFiles({ url, files, fieldName = "file" }) {
if (!url || !files.length) return;
let formData = new FormData();
for (let i = 0; i < files.length; i++) {
formData.append(fieldName, files[i], files[i].webkitRelativePath.replace(/\//g, "@"));
}
return request.post(url, formData);
}
好的,壓縮目錄上傳和目錄上傳已經介紹完了,感興趣的小伙伴可以動手試試看。由于完整的示例代碼內容比較多,阿寶哥就不放具體的代碼了。有需要的小伙伴,可以訪問以下地址瀏覽示例代碼。
https://gist.github.com/semlinker/af57349c16d203cc2ec845d4b5a6b445
注意:以上代碼僅供參考,請根據實際業務進行調整。
本文阿寶哥介紹了如何利用 input[type="file"] 元素的 webkitdirectory 屬性來實現選擇目錄的功能,然后利用 JSZip 這個庫來實現目錄壓縮,最后通過 axios 來上傳目錄壓縮后的 ZIP 文件 。此外,阿寶哥還介紹了如何使用 koa 來實現接收目錄并按照文件目錄結構進行存放的功能。
JSZip 官方文檔
MDN - webkitdirectory
JavaScript 如何在線解壓 ZIP 文件?
作網頁設計是一門需要創新、技術熟練和對細節的理解的藝術。成功的網頁設計旨在創建一個導航方便、功能齊全、信息豐富、吸引人的網站,最終實現吸引訪問者、提供信息和刺激用戶行動的目標。以下是一個全面的教程,一步一步地指導你進行網頁設計。
網頁設計是指利用圖形、排版、色彩等元素,以美觀、易用、有效的方式向用戶呈現網頁內容和功能的過程。它涉及到用戶界面設計、用戶體驗設計、視覺設計等多個方面。在制作網頁設計時,設計師需要考慮網頁的整體布局、導航結構、配色、字體選擇等因素,以及用戶的需求和行為習慣。一個成功的網頁設計應該能夠吸引用戶的注意力,提供清晰的信息傳達和良好的用戶體驗。
在制作網頁設計時,設計師需要考慮以下幾個方面:
目標用戶:了解目標用戶的特點和需求,以便根據自己的喜好和習慣進行設計。
頁面布局:確定頁面的整體結構和元素的位置,使其符合用戶的閱讀習慣和視覺體驗。
導航設計:設計清晰易用的導航菜單,方便用戶瀏覽和導航網頁的不同部分。
色彩選擇:選擇適合主題和目標用戶的色彩搭配,提升網頁的視覺吸引力和用戶體驗。
字體選擇:選擇易讀、符合網頁風格的字體,使文字內容更加清晰易讀。
圖片和圖標:使用合適的圖片和圖標來增加網頁的視覺效果和吸引力。
響應設計:考慮不同設備和屏幕尺寸的適應性,使網頁能夠在不同的平臺上很好地顯示和使用。
即時設計是專門為現代UI/UX設計師設計的。它結合了強大的編輯和排版功能,以及大量的現代功能,如符號(可重用組件)和響應布局,是網頁設計的有力工具。
https://ad.js.design/online/ui/?source=tt&plan=btt724
即時設計的強大功能
交互式原型:即時設計不僅是一種圖形設計工具,而且還支持原型設計。這使得設計師能夠在界面中創建和預覽完整的交互式界面過程,大大提高了網頁設計的效率。
設計共享與合作:即時設計提供 Cloud 功能,這是一個允許設計師將項目上傳到云中并與團隊或客戶共享的在線平臺。他們可以直接在網頁上評論、測試原型和下載資源。該功能大大提高了團隊之間的合作效率。
易用性和靈活性:對于初學者來說,即時設計的簡單直觀的用戶界面非常友好。所有的工具和菜單都經過精心設計和安排,使用戶能夠快速理解和使用。更重要的是,即時設計的強大靈活性也體現在它對插件的支持上。有成千上萬的插件可供選擇,以擴展即時設計的功能,并使網頁設計過程更加順暢。
可以完美應對從簡單的圖標設計到復雜的應用程序和制作網頁設計。
29000+設計元素,支持導出保存
https://js.design/community?category=explore&source=tt&plan=btt724
網頁設計的界面布局在制作網頁設計時非常重要,它決定了網頁的整體結構和用戶體驗。良好的界面布局可以提供清晰的導航和容易瀏覽的內容,使用戶能夠輕松地找到他們需要的信息。
在制作網頁設計時,有幾個關鍵的網頁布局原則需要考慮:
一致性:保持網頁布局的一致性可以讓用戶更容易理解和使用網站。這包括統一的導航欄、相似的頁面結構和一致的字體和顏色選擇。
對齊:正確的對齊元素可以幫助用戶更好地理解網頁的結構和信息水平。使用對齊線將元素對齊到網格或頁面邊緣,使頁面看起來更整潔和專業。
重點:通過使用不同的字體、顏色、大小和風格來突出重要的內容和功能。這可以幫助用戶更快地找到他們需要的信息。
簡潔:避免過多的設計元素和冗余信息,保持界面簡潔直觀。簡單的界面可以提高用戶的注意力和理解能力。
響應設計:考慮到不同設備和屏幕尺寸的用戶,使用響應設計來適應不同的屏幕尺寸和分辨率。這可以提供更好的用戶體驗,并確保網頁能夠在各種設備上正常顯示。
色彩搭配:色彩搭配是制作網頁設計的一個非常重要的環節,它可以直接影響用戶對網頁的感知和體驗。合理的色彩搭配可以使網頁看起來更美觀、更舒適,并能傳達特定的情感和信息。因此,色彩搭配的重要性不容忽視。
確定網頁的布局是制作網頁設計的第一步。網頁布局包括確定網頁的整體結構和組織模式,以及每個元素在頁面中的位置和排列模式。
以下是制作網頁設計時的網頁布局示例:
頭部(Header):包含網頁的標題和導航欄通常位于頁面頂部。
內容區(Content):包含網頁的主要內容,可分為文章、圖片、視頻等多個部分。
側邊欄(Sidebar):它位于內容區旁邊,用于顯示與主要內容相關的其他信息,如相關鏈接、廣告等。
腳部(Footer):頁面底部,包括版權信息、聯系方式等。
在確定網頁布局時,需要考慮用戶體驗和頁面可讀性。合理的布局可以幫助用戶快速找到所需的信息,提高用戶滿意度。
菜單欄是網頁設計的重要組成部分,可以幫助用戶快速導航到網站的不同頁面。為了優化用戶體驗,設計師應考慮以下幾點:
清晰的標簽和分類:菜單欄應包含易于理解的標簽,以便用戶能夠快速找到他們想要的內容。標簽應簡潔明了,并與網站內容相關。同時,菜單欄應按邏輯分類,使用戶能夠輕松找到自己需要的信息。
易于使用的導航:菜單欄的設計應簡單易用。用戶應該能夠輕松地找到他們想要的頁面,并在不同的頁面之間快速切換。為了實現這一點,設計師可以使用下拉菜單、分級菜單和其他技術來組織和顯示菜單欄。
響應設計:隨著移動設備的普及,設計師還應考慮不同屏幕尺寸下菜單欄的性能。菜單欄應能夠適應不同的屏幕尺寸,并且在小屏幕上顯示時不會占用太多的空間。設計師可以使用折疊菜單或隱藏菜單等技術來實現響應設計。
用戶體驗地圖模板案例分享
https://js.design/community?category=detail&type=resource&id=64f601fb448fb96d0c508d80&source=tt&plan=btt724
兼容性測試是網頁設計過程中非常重要的一步,確保網頁能夠在不同的瀏覽器、操作系統和設備上正常顯示和運行。以下是一些兼容性測試的建議和步驟:
選擇測試工具:首先,選擇適合您制作網頁設計項目的兼容性測試工具。有許多免費和付費的工具可供選擇,如BrowserStack、CrossBrsesting和Sauce Labs等。這些工具可以模擬不同的瀏覽器和設備,并提供詳細的測試報告。
測試不同的瀏覽器:確保您的網頁在主流瀏覽器(如Chrome)中、Firefox、Safari和Edge)它可以正常顯示和運行。檢查網頁的布局、字體、顏色和交互元素是否在不同的瀏覽器中一致。
測試不同的操作系統:制作網頁設計也需要考慮不同的操作系統,如Windows、Mac和Linux等。測試您的網頁在不同操作系統中的兼容性,以確保它能在每個操作系統中正常運行。
測試不同的設備:現在用戶使用各種設備訪問網頁,包括臺式電腦、筆記本電腦、平板電腦和手機。測試您的網頁在不同設備上的兼容性,以確保它能夠正確地顯示和操作各種設備。
解決兼容性問題:在進行兼容性測試時,可能會發現一些兼容性問題,如布局混亂、字體顯示錯誤或交互功能不能正常使用。及時記錄和解決這些問題,以確保您的網頁能夠在各種環境中提供良好的用戶體驗。
響應性設計是指網頁可根據不同設備的屏幕大小和分辨率進行自適應性設計。為確保網頁能在不同設備上正常顯示和使用,需進行響應性設計測試。
下面是制作網頁設計時常用的一些響應設計測試方法:
設備測試:使用不同的設備(如手機、平板電腦、筆記本電腦等)進行測試。),檢查不同設備的網頁布局和功能是否正常。測試可以通過手動測試或模擬器進行。
屏幕尺寸測試:測試不同屏幕尺寸下網頁的顯示效果。瀏覽器的開發者工具可以用來模擬不同的屏幕尺寸,也可以用真實的設備進行測試。
瀏覽器兼容性測試:測試網頁在不同瀏覽器上的顯示效果和功能是否正常。普通瀏覽器包括Chrome、Firefox、Safari、Edge等。可以使用瀏覽器開發工具進行測試,也可以使用在線兼容性測試工具。
性能測試:測試網頁的加載速度和性能。為了提高性能,工具可以用來測試網頁的加載時間,并優化網頁的代碼和資源。
用戶體驗測試:測試網頁的用戶體驗是否良好。為了改進網頁的設計和功能,你可以邀請用戶進行測試,收集他們的反饋和建議。
下面是在線準備步驟:
確認網頁的內容和功能:上線前仔細檢查網頁的內容和功能,確保沒有錯誤或缺失。檢查網頁的文本、圖片、鏈接和交互功能,以確保它們能夠正常顯示和運行。
測試網頁兼容性:不同的瀏覽器和設備可能會影響網頁的顯示和功能,因此需要進行兼容性測試。在主流瀏覽器中測試網頁(例如chrome)、Firefox、Safari等。顯示效果和功能是否正常,以及不同設備(如手機、平板電腦、電腦等)。
優化網頁的加載速度:用戶對網頁的加載速度非常敏感,因此需要優化網頁的加載速度,提高用戶體驗。利用瀏覽器緩存,通過壓縮圖片、合并和壓縮CSS和JavaScript文件,減少網頁的加載時間。
備份網頁和數據庫:上線前必須備份網頁的文件和數據庫,防止數據丟失或網頁因意外情況無法訪問。文件傳輸協議可以使用(FTP)將網頁文件備份到本地或云存儲,并對數據庫進行備份。
配置網頁的域名和服務器:上線前需要配置網頁的域名和服務器。將域名指向網頁的服務器IP地址,以確保服務器的配置和環境能夠支持網頁的正常運行。
設置網頁訪問權限:根據網頁的需要,可以設置一些訪問權限來控制用戶訪問和操作網頁。您可以使用用戶名和密碼進行身份驗證,也可以使用訪問控制列表(ACL)限制特定用戶或IP地址的訪問。
監控和分析網頁的性能:上線后,需要對網頁的性能進行監控和分析,了解用戶訪問和網頁運行情況。您可以使用網頁分析工具(如谷歌) Analytics)對網頁數據進行收集和分析,優化網頁的設計和功能。
準備發布材料:網頁設計完成后,需要準備一些發布網頁的材料。其中包括HTML文件、CSS樣式表、JavaScript腳本和其它媒體文件(如圖片、視頻等)。
導出網頁文件:將設計好的網頁導出為HTML文件。確保所有鏈接和資源文件的路徑在導出過程中是正確的。
選用合適的服務器:選用合適的服務器托管您的網頁。您可以選擇建立自己的服務器,也可以選擇使用第三方托管服務。
上傳網頁文件:將導出的HTML文件和相關資源文件上傳到服務器。上傳FTP工具或網頁編輯器的上傳功能。
配置服務器:根據服務器的要求進行相應的配置。它可能包括設置域名、配置數據庫、設置文件權限等。
測試網頁:在發布網頁之前,必須進行測試。確保網頁能夠正常顯示和工作在不同的瀏覽器和設備上。
域名分析:如果你有自己的域名,你需要在你的服務器上分析域名。這樣,用戶就可以通過域名訪問你的網頁。
網頁發布:一切準備就緒后,您可以正式發布您的網頁。您可以通過訪問您的域名或服務器的IP地址來查看您的網頁。
要知道,網頁設計的成功制作不是一蹴而就的。最好的效果只有通過反復試驗和不斷優化才能達到。希望以上指南能幫助你打造一個功能強大、吸引人、有用的網頁設計。
人人都是產品經理【起點學院】,BAT實戰派產品總監手把手系統帶你學產品、學運營。
周末連續兩天給大家講了面向對象編程的主要特性「封裝」和「繼承」,如果你期待今天繼續講「多態」這個特性,可能你要失望了,今天并沒有「多態」,而是教你如何優化網頁加載速度,我就是這么不按規矩出牌,哈哈。
周末在家宅著,刷了不少的網頁,發現很多網站都沒有優化它的加載速度,有時打開一個網頁要等待10來秒才能加載完成,雖然網頁內容很不錯,但是給我的第一印象就是慢,不能忍啊!
其實有很多簡單粗暴,又很有療效的優化方法,我覺得有必要給各位產品經理分享一下,好讓你們去督催開發哥哥優化,改善一下網頁的加載體驗~
首先,我們來看下網頁的加載流程。打開一個網頁,會先拉取一個html頁面,然后瀏覽器解析了這個html頁面后,會根據頁面的內容,去拉取javascript、css和圖片文件,最終根據這些文件,將頁面渲染出來。
我們可以看到,影響一個網頁展示速度的主要因素不是網頁本身,而是它依賴的一些其它文件。如果優化了這些資源的加載速度,那么網頁展示的速度也就上去了。
有哪些簡單粗暴的方法呢?讓我來一一列舉:
一個網頁中,圖片資源的大小占比是最多的,而且單個的文件的大小也很可觀。因此,在保證圖片質量不變的情況下,盡可能的使用高壓縮率的圖片格式,圖片格式可以按照這個優先級選擇webp > jpeg > png > bmp。同時也要根據圖片展示尺寸來拉取大小最為匹配的圖片資源,不要沒事就把原圖拉下來使用。以前我就遇到過這種情況,一個196*196大小區域展示的圖片,它的文件竟然達到了幾兆,最后才發現把1960*1960分辨率的原圖拉下來了。
大部分瀏覽器在發出請求時,會帶上這個標記「Accept-Encoding: gzip, deflate」,表示這個瀏覽器可以接受以gzip壓縮方式傳輸數據,如果你的網頁服務器也支持gzip壓縮數據,那么數據以gzip方式傳輸時,會減少70~80%的流量。
同一個站點下面的不同頁面,往往都會復用一部分資源文件,如果把這些資源文件設置為可緩存的,那么在刷新或者跳轉到另一個頁面時,都無須再從網絡拉取相關資源,這樣就大大加快了網頁的加載速度。
有的網站對于不同的終端制作了不同的頁面,比如說在手機上訪問微博,會從weibo.com重定向至weibo.cn,每一次重定向都會導致瀏覽器重新發起請求,延長加載時間。對于這種情況,應該盡可能使用響應式設計,一個weibo.com站點覆蓋至所有終端。
CDN是一種靜態內容分發網絡,它在每個省,甚至每個城市都部署有自己的服務器,用于分發這些靜態內容,那么當某個城市的用戶要拉取某個資源時,他會首選從本地的CDN服務器上拉取,這樣可以保證他最快速的獲得該資源。據磚家統計,網絡資源中有70%的是靜態資源。這就意味著,有70%的內容產生后是不會變化,那么將它們全部放在CDN上面,可以提升這70%的資源的下載速度。
很多人喜歡把不同的圖片掛在不同當域名下,比如說圖片A掛在a.pm-teacher.com,圖片B掛在b.pm-teacher.com。當一個網頁同時使用圖片A和圖片B時,瀏覽器需要查詢兩個域名,要知道,每次解析域名都是會浪費時間的,所以盡可能的將全部圖片放在一個域名下。
這里說的壓縮和第2點并不重復,上面提到的壓縮是不改變文件內容的壓縮。而css和js中有大量的空格和變量命名(如hello="hello word";),如果將這些空格去除,并用簡單的字母來代換變量名(如a="hello word";),那么這些css和js原文件的大小也會縮小,這樣也對加快拉取速度是有幫助的。
不知道你有沒有看出來,上面提到的優化方案的核心就3點:減少請求數、減少資源大小、找最快的服務器。如果你是一個網站的產品經理,快去找你們的開發確認是否有做過類似的優化吧。
給產品經理講技術,微信公眾號(pm_teacher),人人都是產品經理專欄作家。資深程序猿,專注客戶端開發若干年,對前端、后臺技術略懂,熱衷于對新的科技領域的探索。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。