我一直認爲在服務器上使用NodeJS的一大好處是可以在服務器和客戶端之間共享代碼位(例如輸入驗證)。現在我實際上正在使用NodeJS進行開發,我發現的一個難點是確定每個代碼體執行的責任和上下文。下面我列出一些我曾經遇到過的困難,希望能夠對我可能會忽視的公約或指導意見開啓一些啓示,以幫助提升這些問題。如何使用NodeJS來組織構建,服務器,客戶端和共享JavaScript代碼
構建時碼
建造時間對於使用咕嘟咕嘟,咕嚕,或香草NPM在隨後的基本文件的方式的項目代碼一般都非常容易。大多數小型項目傾向於將所有代碼保存在單個文件中,並且該文件傾向於命名爲常規名稱,例如gulpfile.js,但是我看到這些腳本開始被拆分出更大的項目。我已經看到了一些情況,其中吞噬文件被拆分成多個文件並放置在單獨的目錄下。更糟糕的是,我發現gulpfile.js文件甚至沒有被命名爲這樣的情況,導致新開發人員四處尋找以查找gulp文件的位置,並且一旦找到gulp命令,就必須始終使用特定的--gulpfile選項。
運行時服務器端代碼
的入口點基本節點應用程序似乎僅僅需要運行的節點命令時指出特定的JavaScript文件(例如:node script.js
)。對於Web服務器應用程序(例如使用Express的應用程序),我注意到按照慣例,入口點文件通常稱爲server.js,通常可以在應用程序的根目錄中找到。然而,在其他一些情況下,例如在開發人員環境中運行Web服務器時,我看到吞噬任務承擔了啓動Node的責任。在這些情況下,似乎有多種方法可以包含入口點,但我發現的一個示例是啓動webpack編譯器,然後針對入口點腳本使用要求聲明。弄清楚如何在如何完成典型的命令中加入正常的指導在這種類型的設置中是不平凡的。除了應用程序的入口點之外,NodeJS/Express應用程序的目錄結構似乎沒有任何通用的指導,它們將服務器端特定的代碼保留在它的位置以幫助查找它並將它與構建時間和客戶端代碼。
服務器端故事在服務器端代碼既用於提供靜態內容,服務器端生成的視圖(如使用MVC)的情況下也變得更加複雜,並且用於提供API到客戶端。我的偏好是將API從應用程序項目中分離出來,但我從其他人那裏得到的感覺是,如果我認爲這是合理的關注點分離,那麼就會有一種過度複雜的感覺。
運行時客戶端代碼
由於基於該請求這可能會非常棘手的第一頁上的客戶端代碼往往有不同的切入點。然而,由於URL的普遍透明性以及它們在典型情況下如何映射資源以及現代瀏覽器中調試工具的功能有多強大,所以在腳本的後續操作之後不會太麻煩。對於客戶端代碼來說,困難在於典型的構建過程,這些過程通常最終將文件複製並以不同的名稱放入類似結構的生產中。一個例子是一個名爲src或js的文件夾,該文件夾保存着客戶端和服務器端代碼,除了只有一部分文件恰好包含在構建任務中並且經常變換連接文件並將它們放在分發文件夾中。我見過的這些分發文件夾的通用名稱是dist,public,www和wwwroot。通常情況下,如果不是這些目錄總是在項目的根目錄下,那麼至少可以在不必詢問構建腳本的情況下輕鬆定位。
我的希望是,有一些關於如何將所有這些以一種理智的方式放在一起的一般指導,可能是權威來源,主要是指導像我這樣的人,他們可能想從右腳開始。作爲一個副作用,即使它是一個鬆散的標準,也許能夠引用某種標準也可能減少團隊在開始時要發明和討論的樣板量。在上面列出的每個上下文中,顯然會有一些技術特定的約定,例如在客戶端上針對AngularJS,Meteor或ReactJS所遵循的約定。我正在尋找的約定更具體到分離端到端JavaScript應用程序中的主要高級上下文,其中語言和平臺不再成爲區分它們的明顯方式。
也許遠沒有權威性,我偶然發現了這個討論大型NodeJS應用程序可能佈局的github項目。 https://gist.github.com/lancejpollard/1398757 – jpierson