facebook sam模型(為什么我不再使用MVC框架)

时间:2024-05-15 11:49:34 编辑: 来源:

為什么我再也不使用MVC框架了

其實毫無爭議的是,無數個API項目都是和經常變化的屏幕綁定的。你會有很多針對不同平臺或終端設備的不同API,甚至Sam Newman將其總結為BFF模式,該模式建議為每個類型的設備或平臺開發對應特殊的API,甚至為APP的不同版本。Netflix的Daniel Ja買粉絲bson將其解釋為Experience APIs,無語。

幾個月以前,我開始一段思考旅程,思考為什么我們會最終變成這樣,我們還能夠做些什么?這段思考旅程將我引向了應用架構中最教條的模式:MVC。當我再游歷了reactive響應式編程和函數編程等技術思想以后,我開始聚焦簡單和業界擅長的偷偷膨脹的過程,我相信你會感興趣我的發現。

每個屏幕都在使用的模式是MVC,也就是Mode-View-Controller,MVC在沒有Web時已經被發明出來,其軟件架構是很棒的,起初,厚客戶端是直接和一個數據庫交互訪問通訊,數十年以后,使用了MVC,用于構建OmniChannel 應用。

Angular2即將發布,也許現在是重新評估MVC用途的最好時候,重新評估MVC框架為應用架構帶來的價值。

90年代后期,MVC模式被Struts采用到基于Http的Web應用中,今天它是所有應用的基石。

MVC如此光彩照人,以至于react.js只能使用委婉的方式介紹它們的框架似乎偏離了MVC主流:“React is just the View in MVC”.

當我去年開始使用React時,我感覺有些非常不同之處,如果你改變某個地方的一部分數據,那么立即,而且沒有視圖View和模型Model之間明顯的交互,整個UI就改變了,這就是說,我很失望于React的編程模型,變得孤獨起來,因為從MVC角度來看,React模型將MVC分離的幾個關注混淆在同一個組件中。

作為一個服務器端后端的API設計者,我得出結論,肯定沒有好的辦法將API調用和React前端協調在一起,精確地說,因為React只注重視圖View,竟然沒有MVC中的控制器Controller。

Facebook一直拒絕在框架層次彌補這個“缺憾”,React團隊首先引入了Flux模式。因為對Facebook的失望, Dan Abramov甚至推薦了另外一個模式:Rex,某種程度上走上了正確方向,但是也沒有提供合適方式來連接API和前端。

為什么我不再使用MVC框架

MVC 的輝煌過去與現存問題

在每個用戶界面背后,我們都在使用 MVC 模式,也就是模型-視圖-控制器(Model-View-Controller)。MVC

發明的時候,Web 尚不存在,當時的軟件架構充其量是胖客戶端在原始網絡中直接與單一數據庫會話。但是,幾十年之后,MVC 依然在使用,持續地用于

OmniChannel 應用的構建。

Angular 2 正式版即將發布,在這個時間節點重估 MVC 模式及各種 MVC 框架為應用架構帶來的貢獻意義重大。

我第一次接觸到 MVC 是在 1990 年,當時 NeXT 剛剛發布 Interface

Builder(讓人驚訝的是,如今這款軟件依然發揮著重大的作用)。當時,我們感覺 Interface Builder 和 MVC

是一個很大的進步。在 90 年代末期,MVC 模式用到了 HTTP 上的任務中(還記得 Struts 嗎?),如今,就各個方面來講,MVC

是所有應用架構的基本原則。

MVC 的影響十分深遠,以致于 React.js 在介紹他們的框架時都委婉地與其劃清界限:“React 實現的只是 MVC 中視圖(View)的部分”。

當我去年開始使用 React 的時候,我感覺它在某些地方有著明顯的不同:你在某個地方修改一部分數據,不需要顯式地與 View 和

Model 進行交互,整個 UI 就能瞬間發生變化(不僅僅是域和表格中的值)。這也就是說,我很快就對 React

的編程模型感到了失望,在這方面,我顯然并不孤獨。我分享一下 Andre Medeiros 的觀點:

React 在很多方面都讓我感到失望,它主要是通過設計不佳的 API 來引導程序員[…]將多項關注點混合到一個組件之中。

作為服務端的 API 設計者,我的結論是沒有特別好的方式將 API 調用組織到 React 前端中,這恰恰是因為 React 只關注 View,在它的編程模型中根本不存在控制器。

到目前為止,Facebook 一直致力于在框架層面彌合這一空白。React 團隊起初引入了 Flux 模式,不過它依然令人失望,最近 Dan Abramov 又提倡另外一種模式,名為 Rex,在一定程度上來講,它的方向是正確的,但是在將 API 關聯到前端方面,依然比不上我下面所介紹的方案。

Google 發布過 GWT、Android SDK 還有 Angular,你可能認為他們的工程師熟知何為最好的前端架構,但是當你閱讀

Angular 2 設計考量的文章時,便會不以為然,即便在 Google 大家也達成這樣的共識,他們是這樣評價之前的工作成果的:

Angular 1

并不是基于組件的理念構建的。相反,我們需要將控制器與頁面上各種[元素]進行關聯(attach),其中包含了我們的自定義邏輯。根據我們自定義的指令

如何對其進行封裝(是否包含 isolate s買粉絲pe?),s買粉絲pe 會進行關聯或繼續往下傳遞。

基于組件的 Angular 2 看起來能簡單一點嗎?其實并沒有好多少。Angular 2 的核心包本身就包含了 180 個語義(Semantics),整個框架的語義已經接近 500 個,這是基于 HTML5 和 CSS3 的。誰有那么多時間學習和掌握這樣的框架來構建 Web 應用呢?當 Angular 3 出現的時候,情況又該是什么樣子呢?

在使用過 React 并了解了 Angular 2 將會是什么樣子之后,我感到有些沮喪:這些框架都系統性地強制我使用

BFF“頁面可替換模式(Screen Scraping)”模式,按照這種模式,每個服務端的 API

要匹配頁面上的數據集,不管是輸入的還是輸出的。

棄用 MVC 之后怎么走?

此時,我決定“讓這一切見鬼去吧”。我構建了一個 Web 應用,沒有使用 React、沒有使用 Angular 也沒有使用任何其他的 MVC 框架,通過這種方式,我看一下是否能夠找到一種在 View 和底層 API 之間進行更好協作的方式。

就 React 來講,我最喜歡的一點在于 Model 和 View 之間的關聯關系。React 不是基于模板的,View 本身沒有辦法請求數據(我們只能將數據傳遞給 View),看起來,針對這一點進行探索是一個很好的方向。

如果看得足夠長遠的話,你會發現 React 唯一的目的就是將 View 分解為一系列(純粹的)函數和 JSX 語法:

<V params={ M}/>

它實際上與下面的格式并沒有什么差別:

V = f ( M )

例如,我當前正在從事項目的 Web 站點, Gliiph,就是使用這種函數構建的:

圖1:用于生成站點 Slider 組件 HTML 的函數

這個函數需要使用 Model 來填充數據:

圖2:支撐 slider 的 Model

如果用簡單的 JavaScript 函數就能完成任務,我們為什么還要用 React 呢?

GraphQL?并不完全如此。不要因為 Facebook

大量使用它就對其產生誤解,認為它一定是對你有好處的。GraphQL 僅僅是以聲明的方式來創建視圖模型。強制要求 Model 匹配 View

會給你帶來麻煩,而不是解決方案。React 團隊可能會覺得使用“客戶端指定查詢(Client-specified

queries)”是沒有問題的(就像反應型團隊中那樣):

GraphQL 完全是由 View 以及編寫它們的前端工程師的需求所驅動的。[…]另一方面,GraphQL 查詢會精確返回客戶端請求的內容,除此之外,也就沒什么了。

GraphQL 團隊沒有關注到 JSX 語法背后的核心思想:用函數將 Model 與 View 分離。與模板和“前端工程師所編寫的查詢”不同,函數不需要 Model 來適配 View。

當 View 是由函數創建的時候(而不是由模板或查詢所創建),我們就可以按需轉換 Model,使其按照最合適的形式來展現 View,不必在 Model 的形式上添加人為的限制。

例如,如果 View 要展現一個值v,有一個圖形化的指示器會標明這個值是優秀、良好還是很差,我們沒有理由將指示器的值放到 Model 中:函數應該根據 Model 所提供的v值,來進行簡單的計算,從而確定指示器的值。

現在,把這些計算直接嵌入到 View 中并不是什么好主意,使 View-Model 成為一個純函數也并非難事,因此當我們需要明確的 View-Model 時,就沒有特殊的理由再使用 GraphQL 了:

V = f ( vm (M) )

作為深諳 MDE 之道的人,我相信你更善于編寫代碼,而不是元數據,不管它是模板還是像 GraphQL 這樣的復雜查詢語言。

這個函數式的方式能夠帶來多項好處。首先,與 React 類似,它允許我們將 View 分解為組件。它們創建的較為自然的界面允許我們為 Web 應用或 Web 站點設置“主題”,或者使用不同的技術來渲染 View(如原生的方式)。函數實現還有可能增強我們實現反應型設計的方式。

在接下來的幾個月中,可能會出現開發者交付用 JavaScript 函數包裝的基于組件的 HTML5 主題的情況。這也是最近這段時間,在我的

Web 站點項目中,我所采用的方式,我會得到一個模板,然后迅速地將其封裝為 JavaScript 函數。我不再使用

WordPress。基本上花同等的工夫(甚至更少),我就能實現 HTML5 和 CSS 的最佳效果。

這種方式也需要在設計師和開發人員之間建立一種新型的關系。任何人都可以編寫這些 JavaScript 函數,尤其是模板的設計人員。人們不需要學習綁定方法、JSX 和 Angular 模板的語法,只掌握簡單的 JavaScript 核心函數就足以讓這一切運轉起來。

有意思的是,從反應型流程的角度來說,這些函數可以部署在最合適的地方:在服務端或在客戶端均可。

但最為重要的是,這種方式允許在 View 與 Model 之間建立最小的契約關系,讓 Model 來決定如何以最好的方式將其數據傳遞給 View。讓 Model 去處理諸如緩存、懶加載、編配以及一致性的問題。與模板和 GraphQL 不同,這種方式不需要從 View 的角度來直接發送請求。

蘋果公司了解 MVC 的基本情況,因為他們在上世紀 80 年代初,從 Xerox PARC“偷來了”這一模式,從那時起,他們就堅定地實現這一模式:

圖3:MVC 模式

Andre Medeiros 曾經清晰地指出,這里核心的缺點在于, MVC

模式是“交互式的(interactive)”(這與反應型截然不同)。在傳統的 MVC 之中,Action(Controller)將會調用

Model 上的更新方法,在成功(或出錯)之時會確定如何更新

View。他指出,其實并非必須如此,這里還有另外一種有效的、反應型的處理方式,我們只需這樣考慮,Action 只應該將值傳遞給

Model,不管輸出是什么,也不必確定 Model 該如何進行更新。

那核心問題就變成了:該如何將 Action 集成到反應型流程中呢?如果你想理解 Action 的基礎知識的話,那么你應該看一下

TLA+。TLA 代表的是“Action 中的邏輯時序(Temporal Logic of Actions)”,這是由 Dr. Lamport

所提出的學說,他也因此獲得了圖靈獎。在 TLA+ 中,Action 是純函數:

data’ = A (data)

我真的非常喜歡 TLA+ 這個很棒的理念,因為它強制函數只轉換給定的數據集。

按照這種形式,反應型 MVC 看起來可能就會如下所示:

V = f ( M.present ( A (data) ) )

這個表達式規定當 Action 觸發的時候,它會根據一組輸入(例如用戶輸入)計算一個數據集,這個數據是提交到 Model

中的,然后會確定是否需要以及如何對其自身進行更新。當更新完成后,View 會根據新的 Model 狀態進行更新。反應型的環就閉合了。Model

持久化和獲取其數據的方式是與反應型流程無關的,所以,它理所應當地“不應該由前端工程師來編寫”。不必因此而感到歉意。

再次強調,Action 是純函數,沒有狀態和其他的副作用(例如,對于 Model,不會包含計數的日志)。

反應型 MVC 模式很有意思,因為除了 Model 以外,所有的事情都是純函數。公平來講,Rex 實現了這種特殊的模式,但是帶有

React 不必要的形式,并且在 recer 中,Model 和 Action 之間存在一點不必要的耦合。Action

和接口之間是純粹的消息傳遞。

這也就是說,反應型 MVC 并不完整,按照 Dan 喜歡的說法,它并沒有擴展到現實的應用之中。讓我們通過一個簡單的樣例來闡述這是為什么。

假設我們需要實現一個應用來控制火箭的發射:一旦我們開始倒計時,系統將會遞減計數器(買粉絲unter),當它到達零的時候,會將 Model 中所有未定的狀態設置為規定值,火箭的發射將會進行初始化。

這個應用有一個簡單的狀態機:

圖4:火箭發射的狀態機

其中 decrement 和 launch 都是“自動”的 Action,這意味著我們每次進入(或重新進入)買粉絲unting

狀態時,將會保證進行轉換的評估,如果計數器的值大于零的話,decrement Action 將會繼續調用,如果值為零的話,將會調用

launchAction。在任何的時間點都可以觸發 abort Action,這樣的話,控制系統將會轉換到 aborted 狀態。

在 MVC 中,這種類型的邏輯將會在控制器中實現,并且可能會由 View 中的一個計時器來觸發。

這一段至關重要,所以請仔細閱讀。我們已經看到,在 TLA+ 中,Action 沒有副作用,只是計算結果的狀態,Model 處理

Action 的輸出并對其自身進行更新。這是與傳統狀態機語義的基本區別,在傳統的狀態機中,Action

會指定結果狀態,也就是說,結果狀態是獨立于 Model 的。

在 TLA+ 中,所啟用的 Action 能夠在狀態表述(也就是 View)中進行觸發,這些 Action 不會直接與觸發狀態轉換的行為進行關聯。換

句話說,狀態機不應該由連接兩個狀態的元組(S1, A, S2)來進行指定,傳統的狀態機是這樣做的,它們元組的形式應該是(Sk, Ak1,

Ak2,…),這指定了所有啟用的 Action,并給定了一個狀態 Sk,Action 應用于系統之后,將會計算出結果狀態,Model

將會處理更新。

當我們引入“state”對象時,TLA+ 提供了一種更優秀的方式來對系統進行概念化,它將 Action 和 view(僅僅是一種狀態的表述)進行了分離。

我們樣例中的 Model 如下所示:

model = {

買粉絲unter: ,

started: ,

aborted: ,

launched:

}

系統中四個(控制)狀態分別對應于 Model 中如下的值:

ready = { 買粉絲unter: 10, started: false, aborted: false, launched: false }

買粉絲unting = { 買粉絲unter: [0..10], started: true, aborted: false, launched: false }

launched = { 買粉絲unter: 0, started: true, aborted: false, launched: true}

aborted = { 買粉絲unter: [0..10], started: true, aborted: true, launched: false}

這個 Model 是由系統的所有屬性及其可能的值所指定的,狀態則指定了所啟用的 Action,它會給定一組值。這種類型的業務邏輯必須要在某個地方進行實現。我們不能指望用戶能夠知道哪個 Action 是否可行。在這方面,沒有其他的方式。不過,這種類型的業務邏輯很難編寫、調試和維護,在沒有語義對其進行描述時,更是如此,比如在 MVC 中就是這樣。

讓我們為火箭發射的樣例編寫一些代碼。從 TLA+ 角度來講,next-action

斷言在邏輯上會跟在狀態渲染之后。當前狀態呈現之后,下一步就是執行 next-action 斷言,如果存在的話,將會計算并執行下一個

Action,這個 Action 會將其數據交給 Model,Model 將會初始化新狀態的表述,以此類推。

圖5:火箭發射器的實現

需要注意的是,在客戶端/服務器架構下,當自動 Action 觸發之后,我們可能需要使用像 WebSocket 這樣的協議(或者在 WebSocket 不可用的時候,使用輪詢機制)來正確地渲染狀態表述。

我曾經使用 Java 和 JavaScript 編寫過一個很輕量級的開源庫,它使用 TLA+

特有的語義來構造狀態對象,并提供了樣例,這些樣例使用

WebSocket、輪詢和隊列實現瀏覽器/服務器交互。在火箭發射器的樣例中可以看到,我們并非必須要使用那個庫。一旦理解了如何編寫,狀態實現的編碼

相對來講是很容易的。

新模式——SAM 模式

對于要引入的新模式來說,我相信我們已經具備了所有的元素,這個新模式作為 MVC 的替代者,名為 SAM 模式(狀態-行為-模型,State-Action-Model),它具有反應型和函數式的特性,靈感來源于 React.js 和 TLA+。

SAM 模式可以通過如下的表達式來進行描述:

V = S ( vm ( M.present ( A (data) ) ), nap (M))

它表明在應用一個 Action A 之后,View V 可以計算得出,Action 會作為 Model 的純函數。

在 SAM 中,A(Action)、vm(視圖-模型,view-model)、nap(next-action

斷言)以及S(狀態表述)必須都是純函數。在 SAM 中,我們通常所說的“狀態”(系統中屬性的值)要完全局限于 Model

之中,改變這些值的邏輯在 Model 本身之外是不可見的。

隨便提一下,next-action 斷言,即 nap ()是一個回調,它會在狀態表述創建完成,并渲染給用戶時調用。

圖7:“修改地址”的實現

模式中的元素,包括 Action 和 Model,可以進行自由地組合:

函數組合

data’ = A (B(data))

端組合(Peer)(相同的數據集可以提交給兩個 Model)

M1.present (data’)

M2.present (data’)

父子組合(父 Model 控制的數據集提交給子 Model)

M1.present (data’,M2)

function present (data, child) {

// 執行更新

// 同步 Model

child.present (c(data))

}

發布/訂閱組合

M1.on (“topic”, present )

M2.on (“topic”, present )

M1.on (“data”, present )

M2.on (“data”, present )

有些架構師可能會考慮到 System of Re買粉絲rd 和 Systems of Engagement,這種模式有助于明確這兩層的接口(圖8),Model 會負責與 systems of re買粉絲rd 的交互。

圖8:SAM 組合模型

整個模式本身也是可以進行組合的,我們可以實現運行在瀏覽器中的 SAM 實例,使其支持類似于向導(wizard)的行為(如 ToDo 應用),它會與服務器端的 SAM 進行交互:

圖9:SAM 實例組合

請注意,里層的 SAM 實例是作為狀態表述的一部分進行傳送的,這個狀態表述是由外層的實例所生成的。

會話檢查應該在 Action 觸發之前進行(圖 10)。SAM 能夠啟用一項很有意思的組合,在將數據提交給 Model 之前,View

可以調用一個第三方的 Action,并且要為其提供一個 token 和指向系統 Action 的回調,這個第三方 Action

會進行授權并校驗該調用的合法性。

圖 10:借助 SAM 實現會話管理

從 CQRS

的角度來講,這個模式沒有對查詢(Query)和命令(Command)做特殊的區分,但是底層的實現需要進行這種區分。搜索或查詢“Action”只是

簡單地傳遞一組參數到 Model 中。我們可以采用某種約定(如下劃線前綴)來區分查詢和命令,或者我們可以在 Model 上使用兩個不同的

present 方法:

{ _name : ‘/^[a]$/i’ } // 名字以A或a開頭

{ _customerId: ‘123’ } // id=123 的 customer

Model 將會執行必要的操作以匹配查詢,更新其內容并觸發 View 的渲染。類似的約定可以用于創建、更新或刪除 Model

中的元素。在將 Action 的輸出傳遞給 Model

方面,我們可以實現多種方式(數據集、事件、Action……)。每種方式都會有其優勢和不足,最終這取決于個人偏好。我更喜歡數據集的方式。

在異常方面,與 React 類似,我們預期 Model 會以屬性值的形式保存異常信息(這些屬性值可能是由 Action 提交的,也可能是 CRUD 操作返回的)。在渲染狀態表述的時候,會用到屬性值,以展現異常信息。

在緩存方面,SAM 在狀態表述層提供了緩存的選項。直觀上來看,緩存這些狀態表述函數的結果能夠實現更高的命中率,因為我們現在是在組件/狀態層觸發緩存,而不是在 Action/響應層。

該模式的反應型和函數式結構使得功能重放(replay)和單元測試變得非常容易。

SAM 模式完全改變了前端架構的范式,因為根據 TLA+ 的基礎理念,業務邏輯可以清晰地描述為:

Action 是純函數

CRUD 操作放在 Model 中

狀態控制自動化的 Action

作為 API 的設計者,從我的角度來講,這種模式將 API 設計的責任推到了服務器端,在 View 和 Model 之間保持了最小的契約。

Action 作為純函數,能夠跨 Model 重用,只要某個 Model 能夠接受 Action 所對應的輸出即可。我們可以期望 Action 庫、主題(狀態表述)甚至 Model 能夠繁榮發展起來,因為它們現在能夠獨立地進行組合。

借助 SAM 模式,微服務能夠非常自然地支撐 Model。像 Hivepod.io 這樣的框架能夠插入進來,就像它本來就在這層似得。

最為重要的是,這種模式像 React 一樣,不需要任何的數據綁定或模板。

隨著時間的推移,我希望能夠推動瀏覽器永久添加虛擬 DOM 的特性,新的狀態表述能夠通過專有 API 直接進行處理。

我發現這個旅程將會帶來一定的革新性:在過去的幾十年中,面向對象似乎無處不在,但它已經一去不返了。我現在只能按照反應型和函數式來進行思考。我

借助 SAM 所構建的東西及其構建速度都是前所未有的。另外,我能夠關注于 API 和服務的設計,它們不再遵循由前端決定的模式。

有誰知道山寨手機是啥意思啊

就是指非流水線上下來的電子產品

現在比較著名的就是山寨手機 還有山寨電視機啊 VCD DVD等等

只要是普通家庭有需要的 山寨廠商都會做

以前說的山寨是指的小作坊性質 那時基本上都搞手機 基本上以MTK平臺為基礎來"研制"手機---其實就是拼裝:主板+鍵盤+外殼+攝像頭+揚聲器=一個山寨機 這些手機的操作界面都是一樣而且感覺不美

現在又有了以微軟的移動視窗(WINDOWS MOBILE)為系統的山寨機

于是現在的山寨機就不能再像以前那樣定義了 更何況信產部發放手機牌照的制度已經廢除 所以 現在的山寨機講得就是由沒什么名氣的一些小企業制造的電子產品 有的山寨機制作精良 有的就不行 粗劣的很 山寨機”從字面來解釋:山寨——在山寨中,逃避政府管理。它們或由生產者自己取個品牌名字,或模仿品牌手機的功能和樣式;由于逃避政府管理,他們不繳納增值稅、銷售稅,同時不用花錢研發產品,又沒有廣告、促銷等費用,再加上成功的成本控制和分銷手段的靈活,導致其終端零售價格往往僅是品牌手機的1/2到1/3。

以前的解釋是山寨機可以叫野手機、黑手機或高仿手機,而隨著手機牌照的取消,絕大部分山寨手機似乎合法化。

拼裝這些手機的廠商既不是地下加工廠,又算不上正規軍。

一些價格低廉、功能齊全的貼牌機和名稱五花八門的雜牌手機也都屬于“山寨手機”。

山寨手機及一般國產非智能手機使用的解決方案以臺灣聯發科(MTK)解決方案為主,其他平臺也有出現,而山寨智能手機主要采用windows mobile操作系統的解決方案。

有哪些你看了至少五遍以上的電影?

《追夢赤子心》

“你這輩子不用對任何人證明什么,除了對你自己。”這部電影改編自丹尼爾· 魯迪的真人真事。講述了身材瘦小的魯迪通過不懈努力,進入夢想中的圣母大學橄欖球隊,并最終由替補變為正選隊員的故事 。

《追夢赤子心》是一部年輕人和影迷不容錯過的經典影片,這部電影的標題已經成為了一個代名詞,代表著那些戰勝偏見、勇往直前的赤子之心。

夢想的確是好事,“它讓現實生活變得可以忍受”,但是如果不顧現實的約束而只盯著那個遙遠的美夢,那么夢想就變成了綁架生活的“執念”,主角魯迪就是被夢想所綁架,但是他的不同之處在于,因有了童年經歷和好友之死的沖擊,讓他無論如何也想重現這些往昔的激情,甚至付出極大代價也在所不惜。

他不計代價地在圣母大學橄欖球隊找到了一個干雜活的工作。因為沒錢住宿,他偷偷住在雜物間,雇傭他的黑人幫助了他。四年后考入圣母大學,之后又在校隊的替補陣營待了三年,但他一直沒有機會上場比賽。直到最后一場比賽......

當全場高喊“魯迪”的那一刻,我早已淚流滿面。音樂終于勇敢的站出來成為情緒的潰口,帶給人們那份可以拋棄一切,一心追夢的篤定。

用NASA的3D應用程序可視化日全食

利用美國宇航局的一個新的交互式三維模擬應用程序,從地球上的任何地方了解8月21日日全食的樣子。

8月21日日全食將沿著大約70英里(113公里)寬的路徑從俄勒岡州到南卡羅來納州橫穿美國。美國宇航局的新應用程序“日食的眼睛”模擬了8月21日太陽穿過天空時的樣子。用戶可以沿著日全食路徑探索不同的位置,在日全食中月球將完全遮住太陽,以及將經歷日偏食或不發生日全食的區域。

對日全食的眼睛是NASA眼睛計劃的一部分,它允許用戶跟隨卡西尼號、朱諾號或通過互動應用程序開辟新天地。關注Eclipse可以在任何web瀏覽器上使用,也可以將應用程序下載到您的計算機或移動設備上。【2017年日全食:何時何地如何安全觀測】8月21日上午11:30,紐約市

日偏食模擬。2017年,使用美國宇航局的“月食之眼”應用程序。(NASA)

在應用程序中預覽8月21日的日食,通過NASA的網站打開這個程序,點擊地球圖像上的任何地方,或者從五個預設的美國城市中選擇一個。若要查看特定位置,請選擇“自定義”選項,然后輸入城市和州,或以十進制度數表示的緯度和經度。

程序提供了一個分屏視圖,左側是地球的三維模型,右側是太陽在選定時間和位置出現時的模擬。通過調整時間和地點,你可以看到在日食期間月球將覆蓋多少太陽。

8月21日上午11:30密蘇里州堪薩斯城的日全食模擬。2017年,使用美國宇航局的“月食之眼”應用程序。(美國宇航局)

位置沿著月球中心狹窄的中心線,暗陰影,也稱為本影,將經歷一次日全食,因為月球直接在太陽的圓盤前面移動,并日夜交替。日全食路徑以外的地區仍然會經歷日偏食,這時部分太陽的強光是可見的。美國宇航局提醒天文觀測者在觀看日偏食時戴上安全的太陽眼鏡,以防止永久性的眼睛損傷。

讀者可以在這里下載“eclipse”應用程序的眼睛。

編輯注:太空與模擬課程合作,提供了這個很棒的“eclipse Safari”應用程序,幫助你欣賞日食經驗。蘋果和安卓都有免費的應用程序,你可以在網上查看。如果你拍了一張8月21日日食的驚人照片,請告訴我們!將照片和評論發送到:space photos@space。

關注Samantha Mathewson@Sam_Ashley13。關注我們@Spacedot買粉絲、Facebook和Google+。關于太空的原始文章。

搜索关键词: