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