nodeJs学习(1)

来源:互联网 发布:mac地址可以重复么 编辑:程序博客网 时间:2024/04/30 01:20
什么是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);          //100global.a=200;console.log(a);          //100console.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.exportsconsole.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的关系断开,尽量在做的时候,只在已有的两者之间去添加属性,而不要改变指向关系。
0 0