都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 微服務框架,幫助我們輕鬆構建和管理微服務應用。 本框架不僅支持 Consul 服務註 ...
  • 先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 前言 大家好,推薦一個.NET 8.0 為核心,結合前端 Vue 框架,實現了前後端完全分離的設計理念。它不僅提供了強大的基礎功能支持,如許可權管理、代碼生成器等,還通過採用主流技術和最佳實踐,顯著降低了開發難度,加快了項目交付速度。 如果你需要一個高效的開發解決方案,本框架能幫助大家輕鬆應對挑戰,實 ...