可否通過polyfill讓微軟的wscript能運行node.js腳本?

在Windows上,自帶了一個用於執行JavaScript腳本的解釋器叫做wscript。它支持標準的js用法,也支持文件操作。

突然靈機一動,wscript(Windows Script Host)和node.js十分相像,也支持基礎的io,

那麼可否通過polyfill的方式在wscript上模擬node.js運行時?

考慮到wscript在win上自帶,無需安裝,此舉必能減少js項目的部署難度,推進js開源社區發展!


微軟的人有搞Chakra的node.js分支:GitHub - nodejs/node-chakracore: Node.js on ChakraCore

所以沒有必要自己用wsh搞。

至於說是否可以直接用wsh+polyfill來模擬node.js運行時,理論上當然是有可能的。不過node.js的基礎api都是非同步的,wsh的runtime很可能只能模擬。如果底層使用的仍然是阻塞式的IO,則無法擁有非同步IO的性能。另外wsh默認用的是老的JScript引擎(即IE8-所用的JS引擎),性能很差。


題主你還別說,真的有實現的,不過是基於ASP的。

這裡給張圖:

(不過官網貌似又掛了啊,我本來還想給個fs等模塊的例子的)

(這裡的debugger可是調用Visual Studio的調試器哦)

但是有幾個問題啊:

1.

WSH本身除了Stdin和Stdout之外基本沒有任何能力能與外界交互的。你要進行哪怕是文件讀寫,都要調用COM組件。如,讀取ANSI我們一般用Scripting.FileSystemObject,需要用其它編碼的時候我們會用ADODB.Stream。甚至,VBScript連一個Map對象都要藉助Scripting.Dictionary這玩意來實現。還有常見的圖像處理需求,Windows可沒有gm啦imagemagick啦,ASP程序員最常用的方式是安裝Persits公司的ASPJPEG組件。

像這樣的話,node的http啦socket啦這些模塊你肯定沒法Polyfill(除非你自己寫一個COM組件然後regsvr32)。對了,網路交互的話,這麼多你選哪個?Microsoft.XMLHTTP、WinHttp.WinHttpRequest.5.1、MSXML2.ServerXMLHttp,這幾個語法完全一樣但是有一些細節不同……)

所以,我們還是只能拿這東西寫寫網頁或者寫寫只有簡單命令行交互的東西。

2. 基於以上原因,ASP的與外界交互的操作是完全同步的,這樣你只能把同步包裝成非同步以換取寫法兼容。

3. 語法兼容問題。JScript是ES3語法(看IE6),ES5的Object.defineProperty等是沒法用的。你就算babel + es5-shim,很抱歉,像string[index]這樣沒法shim的語法怎麼辦?

4. 調試難度問題。WSH沒有require等語法,唯一的調用其它模塊的方式是eval("FILE_STRING")。怎麼調試,你猜?你看,這個連e.stack都沒有哦。

5. WSH這東西吧,你要是把.js的文件關聯改了,它有概率出錯……(未找到提供程序)老實說,有空用WSH搞,還不如折騰VBA……


理論上你可以把 nodejs 的那一堆 C 庫封裝成 COM 對象(記得實現 IDispatch)然後給 WSH 用,而且連 VBS 都能用上


歪個樓

RxJS/example1.js at master · Reactive-Extensions/RxJS · GitHub

這個是學rx時候看到的一個wsh例子.


之前我寫了一個,能夠運行基礎的 Node Api: GitHub - aui/node2bat: 基於JScript的迷你NodeJS運行時


推薦閱讀:

如果 ES2015 完全普及了,我們還需要 Babel 嗎?
React-Canvas、React-js、React-Native在用途、語言本質、性能表現等方面,各有什麼異同?
Vue.js 這個框架怎麼樣評價?
如何看待 svelte 這個前端框架?
React 組件設計思路?

TAG:前端開發 | 微軟Microsoft | JavaScript | MicrosoftWindows | Nodejs |