應用程序二進制接口(ABI)是程序調用函數和使用其餘編譯程序的數據結構的一種方法,它是應用程序編程接口(API)的編譯版本,換句話說,頭文件描述了類、函數、數據結構、枚舉和常量,使應用程序可以經過編譯到一組地址來執行所需的任務,和預期參數值和內存結構大小以及編譯ABI提供程序的佈局。node
必須編譯使用ABI的應用程序,以使可用地址、預期參數值、內存結構大小和佈局與編譯ABI提供程序的那些一致,這一般經過編譯ABI提供程序提供的頭文件來完成。git
因爲ABI的提供者和ABI的用戶能夠在不一樣的時間使用不一樣版本的編譯器進行編譯,所以確保ABI兼容性的一部分責任在於編譯器。不一樣版本的編譯器,也許由不一樣的供應商提供,必須從具備特定內容的頭文件生成相同的ABI,而且必須根據頭文件中描述所產生的ABI約定,使用訪問給定頭中描述的API的ABI爲應用程序生成代碼。現今編譯器具備至關好的跟蹤記錄,即不破壞它們編譯的應用程序的ABI兼容性。github
確保ABI兼容性的剩餘責任在於團隊維護頭文件,這些頭文件提供了在編譯時在ABI中保持穩定的API。能夠對頭文件進行更改,但必須密切跟蹤更改的性質,以確保在編譯時,ABI的更改方式不會使ABI的現有用戶與新版本不兼容。編程
Node.js提供由幾個獨立團隊維護的頭文件,例如,node.js團隊維護諸如node.
h和node_buffer.h
之類的頭文件。v8.h
由V8團隊維護,儘管與Node.js團隊密切合做,但該團隊是獨立的,而且有本身的時間表和優先級。所以,Node.js團隊只能部分控制項目提供的頭中引入的更改,所以,Node.js項目採用了語義版本控制。這可確保項目提供的API將爲一個主要版本中發佈的Node.js的全部次要版本和修補程序版本提供穩定的ABI,在實踐中,這意味着Node.js項目已承諾確保針對給定主要版本的Node.js編譯的Node.js原生插件將在由編譯它的主要版本中的任何Node.js次要或補丁版本加載時成功加載。segmentfault
對Node.js配備API的需求已經出現,這致使ABI在多個Node.js主要版本中保持穩定,建立這樣一個API的動機以下:api
爲此,Node.js在版本8.6.0中引入了N-API,並將其標記爲Node.js 8.12.0中項目的穩定組件。API在頭文件node_api.h和node_api_types.h中定義,並提供跨越Node.js主要版本邊界的前向兼容性保證,保證能夠說明以下:數據結構
N-API的給定版本n將在發佈它的Node.js的主要版本中提供,以及Node.js的全部後續版本,包括後續主要版本。函數
原生插件做者能夠經過確保插件僅使用node_api.h
中定義的API以及node_api_types.h
中定義的數據結構和常量來利用N-API前向兼容性保證。經過這樣作,做者經過向生產用戶代表,對於他們的應用程序來講,添加原生插件不會增長維護負擔,就像添加純JavaScript編寫的包同樣。佈局
N-API已版本化,由於有時會添加新API,與語義版本控制不一樣,N-API版本控制是累積的。也就是說,每一個版本的N-API都傳達了與semver系統中的次要版本相同的含義,意味着對N-API所作的全部更改都將向後兼容。此外,在實驗標誌下添加了新的N-API,以便社區有機會在生產環境中審覈它們。插件
實驗狀態意味着,雖然已經注意確保未來沒必要以ABI不兼容的方式修改新API,在生產中還沒有充分證實其正確和有用的設計,所以,在最終歸入即將推出的N-API版本以前,可能會進行ABI不兼容的更改。也就是說,前向兼容性保證還沒有涵蓋實驗性N-API。