都2024年了你還傻傻分不清楚“編譯時”和“運行時”嗎?

来源:https://www.cnblogs.com/heavenYJJ/p/18313840
-Advertisement-
Play Games

在寫vue3編譯原理揭秘電子書的時候,發現有不少粉絲還傻傻分不清楚什麼是編譯時?什麼是運行時?這篇文章我們來讓你徹底搞清楚編譯時和運行時的區別。 ...


前言

在寫vue3編譯原理揭秘電子書的時候,發現有不少粉絲還傻傻分不清楚什麼是編譯時?什麼是運行時?這篇文章我們來讓你徹底搞清楚編譯時和運行時的區別。

關註公眾號:【前端歐陽】,給自己一個進階vue的機會

編譯時

我將編譯這個詞語理解為翻譯,這句話是什麼意思呢?

比如你要和一個老外溝通,你的英文超級爛。所以你說的是中文,老外卻只理解英文。那你們兩個人怎麼溝通呢?所以你需要一個翻譯器來將你說的中文轉換為英文,這樣老外就能理解你說的話了,這個翻譯過程就是我們常說的編譯時

translate

看完上一個例子如果你還沒理解的話,我們再來看一個vue的例子。我們平時寫vue代碼時一般都是寫在文件尾碼名為.vue文件中,也就是官方說的單文件組件 (SFC)。

但是瀏覽器認識尾碼為.vue的單文件組件 (SFC)嗎?

很明顯瀏覽器是不認識的,所以這個時候需要將尾碼為.vue的單文件組件 (SFC)編譯(翻譯)為瀏覽器認識的js文件,這一過程就是我們常說的編譯時

在前端中,一般來說編譯時就是代碼跑在node.js的階段。

大家都知道前端主要分為兩個環境:生產環境和開發環境。

  • 對於生產環境來說,編譯時就是在執行類似yarn build之類的命令,將源代碼打包成瀏覽器可直接執行的代碼這一過程。打包生成的代碼文件是存在磁碟中,這一過程是在node.js中完成的。

  • 對於開發環境來說,編譯時就是在執行類型yarn dev這種啟動命令,同樣將源代碼編譯成瀏覽器可直接執行的代碼這一過程。和生產環境不同的是生成的代碼文件是存在記憶體中,並不會寫到磁碟中,同樣這一過程是在node.js中完成的。

運行時

還是以vue舉例,大家都知道瀏覽器的渲染過程是將一個html文件渲染到頁面上的。在SPA單頁面中瀏覽器接收到的index.html一般是下麵這樣的,如下圖:
html

從上圖中可以看到接收到的html文件中只有一個<div id="app"></div>,那麼瀏覽器又是怎麼從這個空div渲染成豐富多彩的頁面呢?

熟悉vue源碼的同學應該比較清楚,首先是生成一個app對象,然後調用app對象的mount方法將經過編譯時處理後拿到的vue組件對象掛載到<div id="app"></div>上面。這一過程就是所謂的運行時。

對於前端來說,運行時就是代碼執行在瀏覽器的階段。

在瀏覽器中編譯

看到這裡有的小伙伴會有疑惑了,vue好像還提供了一種全局構建的版本。在這個版本中我們可以直接在html文件中使用vue,無需使用webpack或者vite這種打包工具打包。比如下麵這樣:
global

從上圖中可以看到,這種用法中除了將*.vue文件名替換為*.html文件名之外,其他的寫法基本是一模一樣的。在這種用法中由於沒有使用到構建工具webpack或者vite,當然就沒有在node.js中執行的編譯時,那麼這種用法中瀏覽器又是如何識別單文件組件 (SFC)中的<template><script> 和 <style>等模塊呢?

答案是在這種全局構建版本的vue中會內置一個編譯器。在瀏覽器中運行時如果發現了<template><script> 和 <style>等模塊的代碼就會使用內置的編譯器將這些模塊編譯成瀏覽器可執行的代碼。

所以我們前面才會講:一般來說編譯時就是代碼跑在node.js的階段。不一般的情況就是現在這種情況,vue直接內置了一個編譯器,在瀏覽器中進行編譯。但是話說回來,這種在瀏覽器中編譯的模式,性能肯定不如使用構建工具webpack或者vite提前將資源進行打包。

總結

一般情況下編譯時就是代碼跑在node.js的階段,比如執行yarn dev或者yarn build時代碼在node.js中執行的階段。後面我們又講了運行時實際就是代碼在瀏覽器中執行的階段。

最後我們又講了還有一種特殊的情況,像全局構建版本的vue中會內置一個編譯器。讓我們可以脫離webpack或者vite使用vue,這種情況就是在瀏覽器中進行編譯的模式,當然這種模式的性能肯定不如使用構建工具webpack或者vite提前將資源進行打包。

關註公眾號:【前端歐陽】,給自己一個進階vue的機會


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Day 0 配置wsl的 vscode環境 (速通速通!) Day 1 上午講了中山大學的校史以及鴻蒙系統的大體介紹 感慨: 作為互聯網原生的一代,是最具創造性的一代,通過我們的夏令營不僅可以鍛練我們的技術能力,開發能力,溝通能力,從而讓自己鏈接的能力超出自已的物理空間。還可以提升我們的社交能力,溝 ...
  • ‍ 寫在開頭 點贊 + 收藏 學會 apk再見了,Android全新App安裝格式aab https://github.com/google/bundletool https://github.com/google/bundletool/releases https://deve ...
  • 適配原理 頂部導航欄和狀態欄沉浸實現比較簡單,設置Scaffold的AppBar背景色即可,其中surfaceTintColor可以設置IOS滑動之後狀態欄顏色,不想要顯示頂部導航欄高度設置toolbarHeight:0,陰影設置elevation: 0。 @override Widget buil ...
  • 當在UITableViewCell中載入網路圖片時,如果在圖片下載完成之前用戶滑動了UITableView,使得對應的UITableViewCell已經滑出屏幕,那麼這個被滑走的UITableViewCell是否還會顯示圖片,取決於如何處理圖片的載入和UITableViewCell的重用。 UITa ...
  • NSArray 是不可變的;存儲不同類型的對象。這意味著一個NSArray可以同時包含NSString、NSNumber、NSDictionary等不同類型的對象。同時只能存儲對象,不能直接存儲基本數據類型(如 int、float 等)。如果需要存儲基本數據類型,應該先將它們封裝為相應的對象類型(如 ...
  • Hello,小伙伴大家好,我是小VIE,一名學習前端時長兩月半的前端萌新 (ノ◡◝) 這次主要是分享我在前端兩個月的學習過程心得和半個月的實踐成果,希望無論是準備秋招的同學,還是日常中學習、工作、求職的小伙伴都能得到一些信心! ...
  • ‍ 寫在開頭 點贊 + 收藏 學會 引言 眾所周知,進度條是程式員大大模擬的程式運行進度,一般會在某些數值卡住不動,引起99%懸案。但是背後的原理你真的清楚嗎,其實進度條真的是勻速運動的! 先來看看效果 接下來開始實現 創建一個矩形,然後摺疊起來,完成! 創建一個容器,用於寬度限 ...
  • title: 使用 useNuxtData 進行高效的數據獲取與管理 date: 2024/7/22 updated: 2024/7/22 author: cmdragon excerpt: 深入講解了Nuxt 3中useNuxtData組合函數的應用,演示瞭如何通過此函數訪問緩存數據,實現組件間數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...