当前位置: 首页 > Linux

这件事要从nodenode.js说起

时间:2023-04-06 06:40:21 Linux

攻略:可能所有程序员都有命名困难吧。在考虑命名变量、常量、方法、类、文件等时,总是会千方百计尝试一些语义方法。完成。曾经有一段时间,一些初学node的同学遇到了同样的问题:HelloWorld跑不了!原文首发于我的个人博客:这件事从nodenode.js0说起。神秘的HelloWorld问题的起源很简单。我们在写入门程序的时候,很快就会想到流行的一句话:console.log('HelloWorld');所以,将其保存为node.js,然后尝试使用nodenode.js运行示例程序。毫无疑问,在cmd环境下,你会遇到如下报错:(PS:其实无论是Mac、Linux用户,还是在WIndows下使用Powershell或其他终端环境的同学,都无法完美遇到这个问题)1.初步分析这一刻,我有一种失落感。我什至无法运行入门示例程序。我忍不住想了想:是不是该放弃node.js了?言归正传,细心的同学会发现,错误的根源来自WindowsScriptHost,以下简称WSH。我们不难发现,它是Windows操作系统脚本语言程序(script,即:脚本)的运行环境。2.实施了什么?简单分析node的node.js命令,我们自然会识别为:执行node.exe程序,参数为node.js。然而,实际上,真正执行的程序变成了WSH。前面执行的命令nodenode.js并没有任何调用WSH相关的逻辑,那么为什么调用WSH就成为解谜的关键。顺势而为,因为WSH正好是一个执行脚本的服务,而js只是一种脚本,所以可以假设脚本文件node.js是罪魁祸首。然后创建一个test.js的副本,并尝试执行:2.1执行程序的路径根据测试结果,不难猜测nodenode.js命令实际执行的是node.js脚本文件,从而调用WSH服务,出现上图错误。可以确定nodenode.js相当于.\node.jsnode.js,即命令执行的文件的完整路径为:E:\test\node.js。(PS:各位读者不要介意''作为路径分隔符,毕竟'/'在cmd下作为参数分隔符是很重要的位置)2.2补全一个程序的路径2.对于DOS或者Windows,终端可以通过一个特殊的环境变量PATH来“完成”(环境变量的细节本文不做介绍)。下面通过ping命令来做简单的说明:2.2.1定位程序的路径。显然,在任何一台正常的机器上,执行这条命令后都可以得到预期的结果。此时我们可以看到cmd进程下的PATH环境变量包含C:\WINDOWS\system32,通过查看PATH中的元素(文件夹路径)即可完成ping程序的路径:C:\WINDOWS\system32\ping。(在*nix系统下还是通用的)2.2.2补全后缀名(仅限windows,dos)由于windows的可执行概念与*nix略有不同,所以需要补全下程序的后缀名windows平台完成。其中,在*inx下,只需要保证文件的结构符合规范,有可执行权限即可执行;而在windows下,还需要考虑它的后缀名和执行方式(其实是一种打开方式策略)。E:\test>echo%PATHEXT%.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW;.CPL最后,我们补全的程序路径为:C:\WINDOWS\system32\ping.exe,2.2.3特别注意(仅限windows,dos)对于cmd环境,当前目录也会作为路径补全的一部分,和优先级最高。在当前目录下,我们创建一个ping.bat脚本,填写如下内容:@echooff::输出完整路径和文件名及后缀echo%~dpnx0执行结果如下图所示,原来的ping.exe动作很明显被覆盖了。2.2.4小结我们还发现windows默认的可执行文件后缀包含.JS,所以可以推导出原来的nodenode.js命令最终完成的程序路径为:E:\test\node.js3如何打开?从2.2.4的结论可以明确的推断出该命令执行的程序是一个node.js脚本文件,那么为什么要通过WSH来执行呢?答案其实很明显。有个通俗易懂的概念叫打开方式,windows的打开方式是由assoc和ftype决定的。3.1后缀名和打开方式尝试运行assoc命令,发现它控制着后缀名和打开方式ftype的关系。关联|findstr.js运行结果:.js=JSFile.json=VisualStudio.json.14.0.jsonld=VisualStudio.jsonld.14.0.jsx=VisualStudio.jsx.14.0.jsxbin=JSXBINFile.jsxinc=JSXINCFile不难看出.js文件会通过JSFile的打开方法执行。3.2打开方法与执行程序类似,我们也可以运行ftype命令,它定义了可执行程序和调用的参数。类型|findstr"JS"运行结果:JSEFile=C:\Windows\System32\WScript.exe"%1"%*JSFile=C:\Windows\System32\WScript.exe"%1"%*JSXFile="C:\ProgramFiles(x86)\Adobe\AdobeUtilities-CS6\ExtendScriptToolkitCS6\ExtendScriptToolkit.exe"-run"%1"最关键的信息是JSFile=C:\Windows\System32\WScript.exe"%1"%*意思是通过WScript.exe执行js脚本,传递原始参数。最后的节点node.js相当于E:\test\node.jsnode.js。3.3如何破解?发挥你的想象力,别叫它node.js了~是时候改用*inx或者升级powershell了~如果你不介意使用绝对路径...4.通过环境变量扩展学习操作系统级别如PATH定位资源其实这个思路也被广泛应用在各种场景中。我举两个常见的栗子来说明。4.1npm包定位CommonJS规范中通过require加载模块时,通过路径补全策略(详细推荐阅读《深入浅出Node.js》),可以省略模块路径,后缀名,甚至/index都可以自动补全。4.2webpack资源定位咦,resolve中的extensions,aliases等思路一样吗?5、总结全文原创性·本文为随笔,全文思考略带情绪化。请不要拍砖。