## 手把手教你写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`命令引入所有你需要的模块