主頁 > 企業開發 > 檔案/大檔案上傳功能實作(JS+PHP)全程序

檔案/大檔案上傳功能實作(JS+PHP)全程序

2020-09-14 16:34:49 企業開發

檔案/大檔案上傳功能實作(JS+PHP)

 

參考博文:掘金-橙紅年代 前端大檔案上傳

路漫漫 其修遠 PHP + JS 實作大檔案分割上傳

本文是學習檔案上傳后的學習總結文章,從無到有實作檔案上傳功能,前端小白寫的代碼不是最優,如果有錯誤的地方請多多指教,如果本文對你有所幫助,深感榮幸,

 

近期公司的專案中,涉及到上傳大檔案的問題,大檔案上傳用普通表單上傳時出現的問題是,無法斷點續存,一但中途中斷上傳,就要重頭開始,這很明顯不是我們想要的,所以經過一番查詢,學習了一下大檔案分割上傳的方法,并且使用簡單的php做服務端處理程式實作一個功能demo,供以后回顧使用,本人也是初出茅廬的前端小白,記錄下各種功能的實作總結,代碼有錯誤的地方,請多多指正,

 

1.簡單檔案上傳

  • 普通表單上傳

    表單上傳是我們經常使用的功能,而且使用起來也是非常簡單,我們只需要宣告表單內容型別為enctype="multipart/form-data",表明表單上傳檔案的二進制資料,

     <form action="index.php" method="post" enctype="multipart/form-data">
      <input type="file" name="myfile" />
      <input type="submit" value=https://www.cnblogs.com/morningclock/p/"上傳" />
     </form>

    點擊上傳按鈕,就可以將表單發送到服務器,并使用index.php接受到對應的表單資料,存入$_GET/$_POST超級全域變數中,我們只需要使用move_uploaded_file方法,將接收到的檔案資料,存盤起來,就實作了檔案上傳功能了,

     $myfile = $_FILES['myfile'];
     //上傳路徑
     $path = "upload/" . $myfile['name'];
     if(move_uploaded_file($myfile['tmp_name'], $path)){
      echo "上傳成功";
     } else{
      echo "上傳失敗";
     };
  • ajax模擬表單上傳檔案

    當我們有需求,需要異步提交表單或者需要對上傳檔案做一定修改(例如:裁剪尺寸)時,普通的表單上傳就不能滿足我們的需求,因為我們無法修改表單的file值,這時候就需要ajax出場了,這里我們使用jQuery使用ajax更方便快捷,

    我們需要做如下修改:

    • HTML

      我們不需要配置form,只需要配置相應的ID,用于獲取DOM元素物件,

       <form id="myForm">
         <input type="file" name="myfile" id="myFile" />
         <input type="submit" value=https://www.cnblogs.com/morningclock/p/"上傳" id="submitForm"/>
       </form>
       <script src=https://www.cnblogs.com/morningclock/p/"http://code.jquery.com/jquery-1.11.1.min.js"></script>
    • JQuery

      注意,jQuery的ajax方法,會默認配置一些請求資訊,所以我們需要重新配置放置jQuery的默認行為導致資料格式或請求頭資訊出現問題,

      這里的contentTypeprocessData為必須項,

       $('#submitForm').on('click', function(e){
         // 阻止默認表單提交
         e.preventDefault();
       ?
         // 創建表單
         // 默認配置了enctype="multipart/form-data"
         var formData = new FormData();
         formData.append('myfile',$('#myFile')[0].files[0])
       ?
         // 提交表單
         $.ajax({
           type: "POST",
           url: 'post.php',
           data: formData,
           // 阻止jquery賦予默認屬性,使用FormData默認配置enctype="multipart/form-data"
           contentType: false,
           // 阻止jquery自動序列化資料
           processData: false,
           success: function(data){
             console.log('請求正常',data);
          }
        })
       })

       

2.大檔案分割上傳

  • 簡單上傳痛點

    簡單上傳,使用表單提交檔案到服務器時,如果網路不好或者中途中斷,會使檔案上傳失敗,試想一下如果要上傳檔案很大,當你上傳到99%時,突然間中斷,又要重新上傳,那該有多崩潰,那時你可能電腦的想砸了,

     

  • 實作思路

    大檔案上傳,實作的方法,就是將上傳檔案的二進制檔案通過分割的形式,逐個上傳到服務器,在上傳完成后,服務器再對檔案進行拼接操作,

    為了能識別上傳的資料,是哪個檔案,我們必須要擁有一個檔案識別符號,用于識別接收到的檔案資料是屬于哪個檔案的,以及可以實作避免重復上傳,實作秒傳功能等,

    不要忘記由于是異步操作,而且操作的資料段大小不一,會導致整合時無法確認拼接熟悉怒,所以我們需要一個index標識資料段的位置,

    通過初步整理,我們就需要以下的引數

    1. 檔案唯一識別符號

    2. 分割后資料段

    3. 分割資料段的順序索引值

    經過思考,我們可以建立兩個處理程式,來分別處理接受chunk資料段和合并chunk資料段,

    1. file_getchunk.php

      功能:將分割chunk資料,整理并保存,此處我們用檔案形式實作,

    2. file_integration.php

      功能:接收到整合通知,將資料段拼接,并生成檔案,

    整體流程大致如圖:

  • PHP.ini配置

    由于PHP默認配合中,限制了POST與上傳的大小,所以我們為了測驗,需要修改php.ini中的默認配置,

     post_max_size = 50M
     upload_max_filesize = 50M

     

  • talk is cheap,show me the code

    • HTML

       <script src=https://www.cnblogs.com/morningclock/p/"http://code.jquery.com/jquery-1.11.1.min.js"></script>
       <form id="myForm">
         <input type="file" name="myfile" id="myFile" />
         <input type="submit" value=https://www.cnblogs.com/morningclock/p/"上傳" id="submitForm"/>
       </form>
    • JQuery

      獲取檔案物件,檔案識別符號,分割檔案,通過ajax發送切割好的blob資料段,

       $('#submitForm').on('click', function(e){
         // 阻止默認表單提交
         e.preventDefault();
         var myfile = $('#myFile')[0].files[0];
         // 定義檔案識別符號  
         var fileId = getFileIdentifier(myfile);
         // 資料切片
         var chunks = fileSlice(myfile);
         // 發送分割資料段
       sendChunk(fileId, chunks);
       })
     ?
  • 生成檔案唯一標識getFileIdentifier()

    此處可以使用md5,生成檔案唯一的md5(相同檔案md5相同),作為識別符號,這里只初略的處理了一下檔案標識,

       function getFileIdentifier(file){
         // 獲取檔案識別符號
         return file.size + file.name;
      }

     

    • 分割方法fileSlice()

      先將檔案使用blob檔案繼承的方法slice進行切割,生成blob字串,

        function fileSlice(file, chunkSize = 1024*1024*0.2){
          // 1.初始化資料
          var totalSize = file.size;
        var start = 0;
          var end = start + chunkSize;
          var chunks = [];
          // 2.使用bolb提供的slice方法切片
          while(start < totalSize){
            var chunk = file.slice(start, end);
            chunks.push(chunk);
            start = end;
            end += chunkSize;
          }
          // 3.回傳切片組chunk[]
          return chunks;
        }
    • 發送chunk方法sendChunk()

      使用ajax依次發送已經分割好的chunk,并提供對應的資料,請求file_getchunk.php進行處理,此處task串列,用于保證檔案分隔符全部已經完成上傳,

       function sendChunk(id, chunks){
         // 逐個提交
         // 用于保證ajax發送完畢
         var task = [];
       ?
         chunks.forEach(function(chunk, index){
           var formData = new FormData();
           formData.append('fileId', id);
           formData.append('myFileChunk', chunk);
           formData.append('chunkIndex', index);
           $.ajax({
             type: "POST",
             url: 'file_getchunk.php',
             data: formData,
             contentType: false,
             processData: false,
             success: function(done){
               // 移除已完成任務
               task.pop();
               console.log(done,' 已完成');
               if (task.length === 0) {
                 // 發送完畢,整合檔案
                 console.log('通知整合');
                 makeFileIntegration(id, chunks.length);
              }
            }
          })
           task.push('file Working');
        })
       }
    • 通知整合方法makeFileIntegration()

      接收到整合通知,請求file_integration.php進行檔案的整合處理,

       function makeFileIntegration(id, size){
         // 通知已傳輸完成
         $.post(
           "file_integration.php",
          {
             id: id,
             size: size
          },
           function(data){
             console.log(data);
          }
        );
       }
    • PHP- file_getchunk.php

      當PHP監聽到請求時,獲取對應的資料,生成檔案夾,按照chunkIndex存盤資料段,

       if(!is_dir('upload')){
         mkdir('upload', 0777);
       }
       ?
       $chunk = $_FILES['myFileChunk'];
       // 檔案唯一標識
       $fileId = $_POST['fileId'];
       // 臨時檔案夾名稱
       $length = strlen($fileId) - (strlen($fileId) - strpos($fileId, '.'));
       $filedir = substr($fileId, 0, $length);
       ?
       $chunkIndex = $_POST['chunkIndex'];
       ?
       $filepath = 'upload/' . $filedir;
       ?
       $filename = $filepath . '/' . $chunkIndex;
       ?
       if(!is_dir($filepath)){
         mkdir($filepath, 0777);
       }
       move_uploaded_file($chunk['tmp_name'], $filename);
       ?
       echo $chunkIndex;
    • PHP-file_integration.php

      監聽到整合請求,對檔案夾下面的所有檔案,進行依次拼接,并生成最侄訓原出來的檔案,

       $fileId = $_POST['id'];
       // 臨時檔案夾名稱
       $length = strlen($fileId) - (strlen($fileId) - strpos($fileId, '.'));
       $filedir = substr($fileId, 0, $length);
       ?
       $size = $_POST['size'];
       $file = './upload/' . $fileId;
       ?
       // 創建最終檔案
       if(!file_exists($file)){
         // 最終檔案不存在,創建檔案
         $myfile = fopen($file, 'w+');
         fclose($myfile);
       }
       // 用增加方式打開最終檔案
       $myfile = fopen($file, 'a');
       ?
       for ($i = 0; $i < $size; $i++) {
         // 單檔案路徑
         $filePart = 'upload/' . $filedir . '/' . $i;
       ?
         if(file_exists($filePart)){
           $chunk = file_get_contents($filePart);
           // 寫入chunk
           fwrite($myfile, $chunk);
        } else{
           echo "缺少Part$i 檔案,請重新上傳";
           break;
        }
       }
       ?
       fclose($myfile);
       echo "整合完成";
       ?

     

3.更進一步

大檔案分割上傳功能已經基本實作,但是我們還可以擁有很多優化的地方

  • 1.斷點續存,

    我們需要的檔案已經可以正常的分割上傳,服務端也可以正常接收切片,完成資料段切片的合并了,此時我們就可以進一步實作斷點續存了,

    斷點續存,實作方法很簡單,我們只需要獲取到上傳完成的資料段切片資訊,就可以判斷我們應該從哪個資料段開始繼續傳輸資料,

    獲取已經完成資料段切片的資訊,我們可以使用前端保存或者服務端獲取,此處我們使用服務端介面檢測,回傳資料缺失位置來實作斷點續存,

    • 思路整理

      我們要在上傳前,請求服務端查詢出中斷時的位置,利用位置資訊,篩選上傳的資料段切片,

      那么我們要增加的邏輯就是:

      1. offset中斷位置資訊

      2. 查詢中斷位置介面:file_get_breakpoint.php

    • 實作

      • getFileBreakpoint()獲取檔案斷點函式

        此處要保證ajax執行順序,才能正確獲取offset偏移量,實作思路有很多,此處只使用jquery提供的將ajax請求變為同步,進行處理,

        注:同步請求時,success函式回傳值不可以直接return,要保存在一個變數中,在ajax請求外return才能生效,

         // 獲取檔案斷點
         function getFileBreakpoint(id, size){
           var offset = '';
           $.ajax({
             type:"post",
             url:"file_get_breakpoint.php",
             data: {
               id: id,
               size: size
            },
             async: false,
             success:function(res){
               offset = parseInt(res);
            }
          })
           return offset;
         }

         

      • sendChunk()發送資料前獲取offset

         // 上傳前,請求file_integration.php介面獲取資料段開始傳輸的位置
         var offset = getFileBreakpoint(id, chunks.length);
      • 遍歷chunks發送資料段時,增加篩選邏輯

          chunks.forEach(function(chunk, index){
            // ==============新增=================
            // 從offset開始傳輸
            if (index < offset) {
              return;
            }
            // ==============新增=================
           
            var formData = new FormData();
            formData.append('fileId', id);
            formData.append('myFileChunk', chunk);
            formData.append('chunkIndex', index);
            $.ajax({
              type: "POST",
              url: 'file_getchunk.php',
              data: formData,
              contentType: false,
              processData: false,
              success: function(done){
                task.pop();
                console.log(done,' 已完成');
                if (task.length === 0) {
                  console.log('通知整合');
                  makeFileIntegration(id, chunks.length);
                }
              }
            })
            task.push(index+' is Working');
          })
      • 獲取中斷位置介面file_get_breakpoint.php

        這里使用的獲取中斷位置的邏輯很簡單(不是最優),只需要檢測檔案夾是否存在,再依次檢測資料段是否缺失,缺失時回傳缺失段的index,已存在回傳chunks長度size,不存在時回傳0

         // 1.檢測資料檔案是否存在(檔案標識,資料段總數)
         $fileId = $_POST['id'];
         $size = $_POST['size'];
         // 臨時檔案夾名稱
         $length = strlen($fileId) - (strlen($fileId) - strpos($fileId, '.'));
         $filedir = substr($fileId, 0, $length);
         ?
         // 2.按順序檢測缺失的資料段的位置
         // 檢測是否存在檔案夾
         if (is_dir("upload/$filedir")) {
           $offset = $size;
           // 檢測資料段缺失下標
           for ($i = 0; $i < $size; $i++) {
             $filepath = "upload/$filedir/$i";
             if(!file_exists($filepath)){
               // 缺失i部分
               $offset = $i;
               break;
            }
          }
           // 輸出偏移量
           echo $offset;
         }
         else {
           // 是否存在已合并檔案
           if(file_exists("upload/$fileId")){
             echo $size;
          } else{
             // 檔案尚未上傳
             echo 0;
          }
         }

         

  • 2.檔案秒傳

    檔案秒傳的概念,按照我的理解,就是在上傳檔案請求后,服務器端檢測資料庫中是否存在相同的檔案,如果存在相同的檔案,就可以告訴用戶上傳完成了,

    此處在獲取offset后,增加一個判斷就可以實作

     var offset = getFileBreakpoint(id, chunks.length);
     // 增加判斷
     if(chunks.length === offset) {
       console.log('檔案已經上傳完成');
       return;
     }

    當然,這里僅僅是非常簡單的處理,我們還可以使用MD5來作為檔案識別符號,在在服務器端使用這個識別符號是否存在相同檔案,

  • 3.MD5檢測檔案完整性,

    通過md5對檔案加密,傳輸到服務器端,服務器端實作合并后對檔案再進行一次md5加密,比對兩串md5字串是否相同,就可以知道檔案傳輸程序中是否完整,

  • 3.上傳完成后,存盤資料段檔案夾進行洗掉操作,

    我們最后做一步就是將臨時檔案移除操作,在整合完成后,我們只需要在file_integration.php介面中,整合完成后,移除檔案夾及其下面的所有檔案,

     function deldir($path){
        //如果是目錄則繼續
       if(is_dir($path)){
           //掃描一個檔案夾內的所有檔案夾和檔案并回傳陣列
         $p = scandir($path);
         foreach($p as $val){
           //排除目錄中的.和..
           if($val !="." && $val !=".."){
             //如果是目錄則遞回子目錄,繼續操作
             if(is_dir($path.$val)){
               //子目錄中操作洗掉檔案夾和檔案
               deldir($path.$val.'/');
               //目錄清空后洗掉空檔案夾
               @rmdir($path.$val.'/');
            }else{
               //如果是檔案直接洗掉
               unlink($path.$val);
            }
          }
        }
         // 洗掉檔案夾
         rmdir($path);
      }
     }
     //洗掉臨時檔案夾
     deldir("upload/$filedir/");

     

4.總結

  按照上述步驟,可以跟著實作簡單上傳、大檔案分割上傳、斷點續存等知識,起碼下次遇到上傳檔案,心里也有了點底氣,由于本人是前端小白,所以寫的代碼比較簡陋,只是實作了功能,還有許多可以優化的地方,如果代碼有誤,還望指正,

 

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

標籤:jQuery

上一篇:vue-cli中使用jquery

下一篇:基礎表單驗證

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