導(dǎo)讀:興許所有程序員都有命名困難癥,在考慮變量、常量、方法、類、文件等命名時(shí),總會(huì)千方百計(jì)嘗試一些語(yǔ)義化的方式去實(shí)現(xiàn)。
曾經(jīng)有那么一段時(shí)間,一些node初學(xué)的同學(xué)遇到了同樣的問(wèn)題:Hello World 跑不動(dòng)!
原文首發(fā)于個(gè)人博客:這事要從node node.js說(shuō)起
0. 謎之 Hello World問(wèn)題的起源非常簡(jiǎn)單,當(dāng)我們?cè)诰帉懸粋€(gè)入門程序時(shí),就會(huì)迅速想起那句膾炙人口的語(yǔ)句:
console.log("Hello World");
于是乎,順手保存為node.js,緊接著嘗試以node node.js來(lái)運(yùn)行該示例程序。毫無(wú)疑問(wèn),在cmd環(huán)境下,會(huì)遇到如下的報(bào)錯(cuò):
(PS:實(shí)際上無(wú)論是Mac、Linux用戶,亦或是WIndows中使用Powershell或其他終端環(huán)境的同學(xué)都無(wú)法與此問(wèn)題完美邂逅)
1. 初步分析此時(shí)此刻,心中一陣失落,居然連入門的示例程序都無(wú)法運(yùn)行,不禁一陣瞎想:是否該放棄node.js了?
言歸正傳,細(xì)心的同學(xué)會(huì)發(fā)現(xiàn),報(bào)錯(cuò)的源頭來(lái)自Windows Script Host,下簡(jiǎn)稱WSH,我們不難查到它是 Windows 操作系統(tǒng)腳本語(yǔ)言程序(script,即:腳本)的運(yùn)行環(huán)境。
2. 執(zhí)行了什么?簡(jiǎn)單分析一下node node.js這條命令,我們會(huì)很自然地認(rèn)定為:執(zhí)行node.exe程序,參數(shù)為node.js。
然而實(shí)際上,真正執(zhí)行的程序卻變成WSH,前面執(zhí)行的命令node node.js并沒(méi)有任何跟調(diào)起WSH相關(guān)的邏輯,因此為何調(diào)起了WSH成為了解謎的關(guān)鍵。
順蔓摸瓜,由于WSH正好是執(zhí)行腳本的服務(wù),而js恰恰又是腳本的一種,不妨假設(shè)node.js這個(gè)腳本文件就是罪魁禍?zhǔn)住H缓髣?chuàng)建一個(gè)test.js的副本,嘗試執(zhí)行它:
2.1 執(zhí)行程序的路徑根據(jù)試驗(yàn)的結(jié)果不難猜出node node.js命令實(shí)際執(zhí)行了node.js這個(gè)腳本文件,從而調(diào)起WSH服務(wù),進(jìn)而出現(xiàn)上圖的報(bào)錯(cuò)。
順?biāo)浦劭纱_定node node.js等價(jià)于. ode.js node.js,即命令執(zhí)行的文件完整的路徑為:E: est ode.js。
(PS:各位看官切莫介懷""作為路徑分隔符,畢竟在cmd下"/"擔(dān)任參數(shù)分隔符的要職)
2.2 補(bǔ)全程序的路徑先講講通用的說(shuō)法,無(wú)論是 * nix 、OS/2 、DOS 亦或是 windows,其terminal都可以通過(guò)一個(gè)特殊的環(huán)境變量PATH進(jìn)行“補(bǔ)全”(關(guān)于環(huán)境變量的詳細(xì)內(nèi)容本文不作介紹)。
接下來(lái)我們通過(guò)ping命令先做簡(jiǎn)要說(shuō)明:
2.2.1 定位程序的路徑很明顯,在任何一臺(tái)正常的機(jī)器上,這條命令執(zhí)行后都能得到期待的結(jié)果。此時(shí)我們可以看到該cmd進(jìn)程下的PATH環(huán)境變量中包含C:WINDOWSsystem32,通過(guò)對(duì)PATH中的元素(文件夾路徑)即可將ping程序的路徑補(bǔ)全為:C:WINDOWSsystem32ping。(在 * nix 系統(tǒng)下依然通用)
2.2.2 補(bǔ)全后綴名(僅windows、dos)由于windows的可執(zhí)行的概念和 * nix 略有不同,因此在windows平臺(tái)下還需要對(duì)程序進(jìn)行后綴名的補(bǔ)全。
其中在 * inx下,只需保證文件的結(jié)構(gòu)符合規(guī)范,并且擁有可執(zhí)行權(quán)限,就可以執(zhí)行;而在windows下,還需要考慮其后綴名及執(zhí)行方式(實(shí)際上是一種打開方式的策略)。
E: est>echo %PATHEXT% .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW;.CPL
最終我們補(bǔ)全的程序路徑為:C:WINDOWSsystem32ping.exe,
2.2.3 特別注意(僅windows、dos)針對(duì)于cmd環(huán)境,當(dāng)前目錄也會(huì)作為路徑補(bǔ)全的一部分,并且優(yōu)先級(jí)最高。在當(dāng)前目錄下,我們創(chuàng)建一個(gè)ping.bat的腳本,并填充以下內(nèi)容:
@echo off :: 輸出完整的路徑和文件名及后綴 echo %~dpnx0
執(zhí)行結(jié)果如下圖,原來(lái)的ping.exe的動(dòng)作明顯被覆蓋了。
2.2.4 小結(jié)我們也額外地發(fā)現(xiàn)windows的默認(rèn)可執(zhí)行的后綴名包含.JS,由此可推斷最初的那條node node.js命令最終補(bǔ)全的程序路徑為:E: est ode.js
3 打開方式?從2.2.4的結(jié)論中能顯而易見的推導(dǎo)出命令執(zhí)行的程序?yàn)?b>node.js腳本文件,那么它為什么是通過(guò)WSH去執(zhí)行的呢?
答案其實(shí)很明顯,有個(gè)通俗易懂的概念,叫做打開方式,而windows的打開方式由assoc和ftype確定。
3.1 后綴名與打開方式嘗試性的跑一跑assoc命令,發(fā)現(xiàn)其控制著后綴名與打開方式ftype的關(guān)系。
assoc | findstr .js
運(yùn)行結(jié)果:
.js=JSFile .json=VisualStudio.json.14.0 .jsonld=VisualStudio.jsonld.14.0 .jsx=VisualStudio.jsx.14.0 .jsxbin=JSXBINFile .jsxinc=JSXINCFile
不難看出.js文件將會(huì)通過(guò)JSFile這個(gè)打開方式去執(zhí)行。
3.2 打開方式與執(zhí)行程序類似的,我們也可以運(yùn)行一下ftype命令,其定義了可執(zhí)行程序以及調(diào)用的參數(shù)。
ftype | findstr "JS"
運(yùn)行結(jié)果:
JSEFile=C:WindowsSystem32WScript.exe "%1" %* JSFile=C:WindowsSystem32WScript.exe "%1" %* JSXFile="C:Program Files (x86)AdobeAdobe Utilities - CS6ExtendScript Toolkit CS6ExtendScript Toolkit.exe" -run "%1"
其中最關(guān)鍵的信息為JSFile=C:WindowsSystem32WScript.exe "%1" %*,含義是通過(guò)WScript.exe執(zhí)行js腳本,并將原來(lái)的參數(shù)傳遞過(guò)去。
最終node node.js等價(jià)于E: est ode.js node.js。
3.3 怎么破?發(fā)動(dòng)想象力吧,別再叫node.js了~
是時(shí)候切換到 * inx 或者升級(jí)到powershell了~
如果不介意使用絕對(duì)路徑的話……
4. 擴(kuò)展學(xué)習(xí)操作系統(tǒng)層面通過(guò)PATH等環(huán)境變量進(jìn)行資源定位的思路實(shí)際上也被廣泛應(yīng)用在各種場(chǎng)景下,下面也舉兩個(gè)常見的栗子說(shuō)明一下。
4.1 npm 包定位CommonJS 規(guī)范中通過(guò)require去加載模塊時(shí),通過(guò)路徑補(bǔ)全的策略(詳情推薦閱讀《深入淺出Node.js》),可以省略模塊的路徑,后綴名,甚至連/index也能自動(dòng)補(bǔ)全。
4.2 webpack資源定位嘿,resolve中的extensions、alias等思路是否也如出一轍呢?
5. 總結(jié)全文原創(chuàng)·此文為隨走隨記,全文思維略帶感情請(qǐng)勿拍磚。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/84972.html
摘要:現(xiàn)狀最近在寫歡迎的時(shí)候,一直為錯(cuò)誤的棧追蹤而愁。由于送入隊(duì)列的是函數(shù),因此在的參數(shù)可以放心地使用。其次,這些函數(shù)并不是立即在中調(diào)用的,而是由專門的隊(duì)列處理代碼來(lái)調(diào)用。 本文的講述都是以 Node.js 環(huán)境為例子,而 Node.js 使用的 JavaScript 引擎是 V8,因此理論上 Chrome 也能適用,其它瀏覽器我就不清楚了。 現(xiàn)狀 最近在寫 Rize(歡迎 star) 的時(shí)...
摘要:模塊化編程,已經(jīng)成為一個(gè)迫切的需求。隨著網(wǎng)站功能逐漸豐富,網(wǎng)頁(yè)中的也變得越來(lái)越復(fù)雜和臃腫,原有通過(guò)標(biāo)簽來(lái)導(dǎo)入一個(gè)個(gè)的文件這種方式已經(jīng)不能滿足現(xiàn)在互聯(lián)網(wǎng)開發(fā)模式,我們需要團(tuán)隊(duì)協(xié)作模塊復(fù)用單元測(cè)試等等一系列復(fù)雜的需求。 隨著網(wǎng)站逐漸變成互聯(lián)網(wǎng)應(yīng)用程序,嵌入網(wǎng)頁(yè)的Javascript代碼越來(lái)越龐大,越來(lái)越復(fù)雜。網(wǎng)頁(yè)越來(lái)越像桌面程序,需要一個(gè)團(tuán)隊(duì)分工協(xié)作、進(jìn)度管理、單元測(cè)試等等......開發(fā)...
摘要:你們說(shuō)能不能就用的開發(fā)模式來(lái)實(shí)現(xiàn)客戶端啊這樣版版版就都有了。有道云筆記可能就是最貼近我們想法的產(chǎn)品,有客戶端,有版。這個(gè)項(xiàng)目由發(fā)起和維護(hù)。 最近一個(gè)多月一直在用 AngularJS 做公司的一個(gè)項(xiàng)目(還沒(méi)有做完),我之前主要是用 PHP 開發(fā)服務(wù)端的,AngularJS 也是現(xiàn)學(xué)現(xiàn)賣,整個(gè)過(guò)程還是比較有意義的,覺(jué)得很有必要寫篇文章記錄一下。 緣起 事情是這樣的……我們團(tuán)隊(duì)的產(chǎn)品是一款 ...
閱讀 2650·2023-04-26 00:42
閱讀 2799·2021-09-24 10:34
閱讀 3810·2021-09-24 09:48
閱讀 4145·2021-09-03 10:28
閱讀 2577·2019-08-30 15:56
閱讀 2771·2019-08-30 15:55
閱讀 3254·2019-08-29 12:46
閱讀 2244·2019-08-28 17:52