什么是NodeJS?和JavaScript有很大渊源的 JavaScript组成:ECMAScript(定义这门语言的基础,比如语法、数据类型、结构以及一些内置对象等)、DOM(基于ECMASCRIPT,扩展出来的用于操作页面元素的方法)、BOM(基于ECMASCRIPT,扩展出来的用于操作浏览器的一些方法)。 NodeJS是以ECMASCRIPT为基础,然后在这个基础上扩展出来的一些操作其他东西(即操作非浏览器)的一些方法,比如操作OS操作系统、file文件系统、net网络、database数据库等。也就是说nodejs和JS在底层都是一样的,都是ecmascript,但是扩展出来的功能却是不一样的。一个是偏向于前端浏览器,一个是偏向于后端。 新建一个hello.js的文件夹,保存后如何去显示nodejs的内容呢?需要先进行解析。像js是通过浏览器内置的解析器来进行解析的一样,nodejs也是有自己的解析器的,nodejs的解析器可以在nodejs官网上下载得到。https://nodejs.org/en/download/中下载 Windows Installer (.msi)文件,下载完成后,点击进行安装即可。双击node.exe可以打开,但是需要借助一些语法。也可以通过命令行打开。win+r键调出命令行,输入cmd进入。输入node后回车,如果出现>和光标换行,说明node安装成功了,并且能在任何地方运行的。两次ctrl+c可退出。注意,在win10版本中,需要输入.exit才可退出。 作业:课后百度下一些基本的命令行操作。 清屏:cls+回车 查看node版本:node -v+回车 执行node文件:node node文件路径,如:node c:\xampp\htdocs\huihui\hello.js+回车,即可看到node文件的输出内容 也可以直接进入该文件所在的路径文件夹,然后使用相对路径来执行node文件。 通过命令行来执行node是可以的,但是不推荐这种做法,推进简使用编辑器来执行。这里介绍webstorm编辑器来执行node的方法。 webstorm中的nodejs配置:file-settings-输入node,搜索,得到node.js and NPM,在有右侧node interpreter中选择我们node的安装路径,当然系统也会自动检测该路径,选择完后点击OK即可。选择完后,在hello.js文件中,点击右键,即可看到run 'hello.js'选项,点击后就会调用内置的命令行文件,来执行和输出node文件的程序运行结果。其结果和我们在命令行中执行的结果是一样的。这样就可加快我们的程序调试速度,同时也可以调用代码提示来加快编辑调试速度。如何配置webstorm中node的代码提示呢?file-settings-输入node,搜索,得到node.js and NPM,点击右侧config,加载node和核心模块,此时出来一个弹框,可以使用刚才下载好的包,也可以去线上下载。下载完成后,点击“edit usage score”,然后点击project,在project条右边点击一下,出来一个列表,将列表项的node有关东西都勾选上,点击确定。这样再在node文件hello.js中输入关键词后就会有提示了。 nodejs和JavaScript的异同: -ECMAScript -语法 -内置对象 ECMAScript中文版:http://lzw.me/pages/ecmascript/ 在ecmascript部分node和JS其实是一样的,比如与数据类型的定义、语法结构,内置对象。但在js中的顶层对象是window对象,但是在node中没有什么window对象,node中的顶层对象是global对象。这就是二者的差异性。 在window对象中,定义一个全局变量是可以通过Window来访问的,但是在node中是不能通过global对象来访问的,如: var a=100; console.log(global.a);这种方式是输出结果为undefined 对于上面这个例子,因为在node中定义的变量是模块中的对象,而并不是global全局变量,所以结果为undefined 模块:在node中,一个文件就是一个模块,每个模块都有自己的作用域。我们使用var来声明的一个变量,他并不是全局的,而是属于当前模块下。要定义一个全局变量需要使用global.a来定义,如: var a=100; console.log(a); //100 global.a=200; console.log(a); //100 console.log(global.a); //200 __filename:当前文件被解析过后的绝地路径,可以直接拿来用的 console.log(__filename); 模块加载系统:使用require('模块'),例如引入同目录下的2.js文件:require('./2.js');就可以输出2.js中的执行结果 模块加载机制中的路径: 1.相对路径:require('./2.js'),如果路径前面没有带./的话,就会去加载node中的核心模块,或者是node_modules 2.绝对路径:require('c:/xampp/htdocs/huihui/2.js'); 模块加载机制中的文件查找规则:require('./2')为例,首先会查找的是require('./2'),也就是会查找同目录下的文件名为2的文件(不带后缀名),即首先会按照加载的模块的文件名称进行查找,如果没有找到,则会在模块文件名称后加上.js的后缀进行查找。如果还没有找到,则会在文件名称后加上.json的后缀,进行查找。如果还没有,则会在文件名称后加上.node的后缀,进行查找。如果还没找到,则抛出错误。即先后顺序是:文件名称 ->.js ->.json ->.node 如果我们在一个模块中声明了一个变量,如何在另一个模块中调用这个变量呢? 在一个模块中通过var定义的变量,其作用域范围是当前模块,外部不能够直接访问。如果我们想一个模块能够访问另一个模块中定义的变量,可以: 1.把变量作为global对象的一个属性,比如global.a=100;但是这样的做法是不推荐的 2.使用模块对象module,用于保存提供和当前模块有关的一些信息。在这个module对象,有一个子对象exports对象,我们可以通过这个对象把一个模块中的局部变量对象进行提供访问。 在模块作用域内,还有一个内置的模块对象exports,他其实就是module.exports 可以在4.js模块中做如下声明: module.exports.a=a; console.log(module.exports===exports); 上述打印的返回结果是TRUE,也就是说内置的模块对象exports,他其实就是module.exports。即上述module.exports.a=a;也可以写成exports.a=a; 在3.js中调用4.js的变量: var m=require('./4.js');//这个方法的返回值,其实就是被加载模块 中的module.exports console.log(m); 可以看出不管是写成module.exports.a=a;还是exports.a=a;两者输出结果都是一样的,但是在使用中需要注意的是,尽量不要去破坏他们之间的引用关系。具体的请看下面说明: module.exports=[1,2,3];//exports和module.exports的指向关系已经断开了 exports.a=200;//有了上面的话,这个时候exports和module.exports就已经没有引用关系了,如果在另一个模块中执行3.js的内容,其结果还是[1,2,3]。同理,也不要在写了module.exports=[1,2,3]后又写了exports=[1,2,3],这样也是将exports和module.exports的关系断开,尽量在做的时候,只在已有的两者之间去添加属性,而不要改变指向关系。
nodeJs学习(1)
最新推荐文章于 2022-07-23 17:55:45 发布