## 手把手教你写Hello Node [TOC] ### 运行nodejs 1.打开命令行,输入`node`,然后回车,就进入命令交互模式了,可以输入一条代码语句后立即执行并显示结果,例如: ~~~ $ node > console.log('Hello World!'); Hello World! ~~~ 2.如果你需要写一大段代码(一段脚本、一个工程等),第一种运行的方式就不适合了。 这时,我们可以创建一个js文件,比如 `index.js`,然后,在`index.js`中输入要运行的代码,例如: ~~~ function hello() { console.log('Hello World!'); } hello(); ~~~ 代码写完后,打开命令行,`cd`到`index.js`所在工作目录,输入 ~~~ $ node index.js ~~~ 回车运行,结果如下: ~~~ $ node hello.js Hello World! ~~~ 这种运行方式遵循 `node path`(`path`为文件所在的路径,可以是绝对路径也可以是相对路径)的格式。所以,如果你懒得`cd`到`index.js`所在工作目录,你也可以输入相对路径或者绝对路径。 ### 模块化 在前端开发过程中,我们习惯将代码合理的拆分在不同的`js`文件中,编写`NodeJs`也不例外,在`NodeJs`中,一个文件就是一个模块,每个模块都已经预定义好了3个变量——`require、exports、module`。 * require >`require`函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。模块名可使用相对路径(以./开头),或者是绝对路径(以/或C:之类的盘符开头)。另外,模块名中的`.js`扩展名可以省略。 举个栗子: ~~~ //index.js var foo1 = require('./foo'); var foo2 = require('./foo.js'); var foo3 = require('/home/user/foo'); var foo4 = require('/home/user/foo.js'); // foo1至foo4中保存的是同一个模块的导出对象。 ~~~ 另外,可以使用以下方式加载和使用一个`JSON`文件。 ~~~ /赋值完成后,/变量data是一个json对象 var data = require('./data.json'); ~~~ * exports `exports`对象是当前模块的导出对象,用于导出模块公有方法和属性。别的模块通过`require`函数使用当前模块时,得到的就是当前模块的`exports`对象。以下例子中导出了一个公有方法。 ~~~ //foo.js //导出一个名为hello的方法 exports.hello = function () { console.log('Hello World!'); }; ~~~ 这里,我们和`require`结合起来用,假设我里创建了一个`index.js`文件,他和`foo.js`在同级目录下,在`index.js`文件中引用`foo.js` ~~~ //index.js //引用foo.js文件导出对象 var foo= require('./foo.js'); //执行hello foo.hello(); ~~~ 代码编写完了,打开命令行,`cd`到`index.js`所在目录,运行结果如下: ~~~ $ node index.js Hello World! ~~~ * module 通过`module`对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。例如模块导出对象默认是一个普通对象,如果想改成一个函数的话,可以使用以下方式。 ~~~ module.exports = function () { console.log('Hello World!'); }; ~~~ 以上代码中,模块默认导出对象被替换为一个函数。 实际开发过程中,特别是有一定代码量的项目,有一种做法,是把各个模块对象化,模块导出对象替换成自定义对象。下面举个例子: ~~~ //user.js function User(pName){ this.name=pName; this.say=function(){ console.log('你好,我是隔壁 '+this.name); } } //将模块导出对象替换为User module.exports=User; ~~~ ~~~ //index.js 引用user.js导出模块 var User=require('./user.js'); //创建一个user对象 var user1=new User('老王'); //调用这个对象的say方法 user1.say(); ~~~ 你可以自行创建`index.js`和`user.js`这两个文件,将上面的代码拷贝到对应的文件,自己运行一下。这里,index.js是**模块的入口**,也就是这个工程的**主模块** >Tip:模块初始化 一个模块中的J`S`代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。之后,缓存起来的导出对象被重复利用。 ### 使用NodeJs内置模块 `NodeJs`内置了很多常用模块,你可以在 [nodejs中文网](http://nodejs.cn/api/)上看到最新稳定版的API,下面举个栗子来说明如何使用`NodeJs`的内置模块。 ~~~ //引用NodeJs内置模块文件系统模块fs var fs=require('fs'); //在当前目录下创建一个名为“dir”的文件夹,如果已存在,则报错 fs.mkdirSync('dir'); ~~~ `NodeJs`的内置模块直接通过模块名称引用即可 ### 使用第三方模块 `NodeJs`只内置了我们常用的基本模块,实际开发过程中我们常常会用到第三方模块,这个时候`npm`就派上用场了。 这里,我们以第三方模块——文件系统拓展模块[fs-extra](https://www.npmjs.com/package/fs-extra)的使用为例。 1.初始化工程并生成`package.json`文件 ~~~ $ npm init ~~~ 2.安装第三方模块 ~~~ $ npm install fs-extra --save ~~~ 3.这个时候,你在当前工作目录下可以看到,多了一个文件夹`node_modules`,打开`node_modules`,多了一个`fs-extra`的文件夹,这就是我们从`npm`上下载的第三方模块`fs-extra`.我们可以开始使用了`fs-extra`模块了。 ~~~ //index.js //引用第三方模块fs-extra var fse=require('fs-extra'); //创建一个名为dir的文件夹,如果已存在则不创建 fse.ensureDirSync('dir'); ~~~ >Tips: 一个工程中,我们往往不只引入一个模块,只要`package.json`存在,你就可以使用`npm install`命令引入所有你需要的模块