# 章節(jié)導(dǎo)航
[TOC]
# Node.js-API
* `path.basename()`取得一個(gè)路徑的最后一部分文件名
* `path.normalize()`幫助修正路徑
* `path.join()`用于路徑拼接(參數(shù)為多個(gè)路徑參數(shù))
* `path.resolve()`將一個(gè)相對(duì)路徑解析為絕對(duì)路徑
* `{basename, dirname, extname}`
* `basename` 完整名
* `dirname` 上級(jí)路徑名
* `extname` 后綴名
* `{parse, format}`
* `parse`用于解析當(dāng)前路徑為一個(gè)json格式的數(shù)據(jù)
* `format`相當(dāng)于格式化json數(shù)據(jù)為一個(gè)字符串
說(shuō)明:`__dirname`、`__filename`總是返回文件的絕對(duì)路徑
? `process.cwd()`總是返回node命令所在文件夾
#### Buffer
三個(gè)要點(diǎn):
* Buffer用于處理二進(jìn)制數(shù)據(jù)流
* 實(shí)例類(lèi)似整數(shù)數(shù)組,大小固定
* C++代碼在V8堆外分配物理內(nèi)存
Buffer常用的方法
* `byteLength`統(tǒng)計(jì)buffer所占字節(jié)數(shù)
* `isBuffer`用來(lái)判斷目標(biāo)數(shù)據(jù)是不是一個(gè)Buffer
* `concat`合并連接Buffer
* `from`將目標(biāo)數(shù)據(jù)轉(zhuǎn)換為Buffer
* `toString`用來(lái)轉(zhuǎn)換Buffer為字符串
#### events
* `eventEmitter.on('eventName',callback())`用于注冊(cè)監(jiān)聽(tīng)器
* `eventEmitter.emit('eventName')`用于觸發(fā)事件
```
const EventEmitter = require('events');
class CustomEvent extends EventEmitter {
}
const ce = new CustomEvent();
ce.on('eventName',callback);
ce.emit('eventName','your msg to eventEmit',....);
//有一個(gè)通用參數(shù)就叫error
ce.on('error',fn);
//Example
ce.on('error',(err, item) => {
console.log(err);
console.log(item);
});
ce.emit('error', new Error('出錯(cuò)了'), Date().now);
```
針對(duì)事件只需要響應(yīng)一次:
~~~
ce.once('test', ()=> {
console.log(test);
});
復(fù)制代碼
~~~
針對(duì)事件需要移除的話(huà):
~~~
ce.removeListener('eventName',fn);
//or
ce.removeAllListeners('test');
復(fù)制代碼
~~~
## fs
首先需要注意的就是Node.js的設(shè)計(jì)模型就是錯(cuò)誤優(yōu)先的模式
```
fs.readFile('fileUrl','utf8',(err,data) => {
if(err) throw err;
console.log(data)
})
```
stat( ) 查看文件詳細(xì)信息
```
const fs = require('fs');
fs.stat('filerUrl',(err,data) => {
if(err){
throw err;
}
console.log(data)
})
```
rename( ) 更改文件名
```
fs.rename('./text.tex','hahah.ttx');
```
unlink( ) 刪除文件
```
fs.unlink('fileName',err => err);
```
readdir( ) 讀取文件夾
mkdir( )創(chuàng)建文件夾
rmdir( ) 刪除文件夾
watch( )監(jiān)視文件或目錄變化
```
fs.watch('fileUrl', {
recursive:true //是否監(jiān)視子文件夾
}, (eventType, fileName) => {
console.log(eventType, fileName);
})
```
* `readStream()`讀取流
~~~
const rs = fs.createReadStream('urlPath');
rs.pipe(process.stdout);//導(dǎo)出文件到控制臺(tái)
復(fù)制代碼
~~~
* `writeStream()`寫(xiě)入流
* `pipe()`管道,導(dǎo)通流文件
~~~
const ws = fscreateWriteStream('urlPath');
ws.write('some content');
ws.end();
ws.on('finish',()=>{
console.log('done!!!');
});
~~~
## 靜態(tài)資源服務(wù)器
#### `http`模塊
~~~
const http = require('http');
const chalk = require('chalk');
const hostname = '127.0.0.1';
const port = '3000';
const server = http.createServe((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, hostname, () => {
const addr = `Server running at http://${hostname}:${port}/`;
console.log(`${chalk.green(addr)}`);
})
~~~
* `supervisor`監(jiān)視文件模塊
* `hotnode`熱啟動(dòng)模塊
# 額外項(xiàng)目案例
~~~
// 1. 引入 http 模塊
var http = require("http");
// 2. 用 http 模塊創(chuàng)建服務(wù)
/**
* req 獲取 url 信息 (request)
* res 瀏覽器返回響應(yīng)信息 (response)
*/
http.createServer(function (req, res) {
// 設(shè)置 HTTP 頭部,狀態(tài)碼是 200,文件類(lèi)型是 html,字符集是 utf8
res.writeHead(200, {
"Content-Type": "text/html;charset=UTF-8"
});
// 往頁(yè)面打印值
res.write('<h1 style="text-align:center">Hello NodeJS</h1>');
// 結(jié)束響應(yīng)
res.end();
}).listen(3000); // 監(jiān)聽(tīng)的端口
復(fù)制代碼
~~~
?那么,上面代碼,我們要怎么用呢?
?**首先**,將上面的代碼復(fù)制粘貼到 `01_http.js` 中。
?**然后**,啟動(dòng) VS Code 終端:`Ctrl + ~`。
?**接著**,輸入 `node 01_http.js` 并回車(chē)。
?**最后**,打開(kāi) `localhost:3000`:
1. **首先**,我們需要先開(kāi)啟仙人模式。哦,不是,是 HTTP 模式。我們都知道,像 PHP 這類(lèi)老牌子的后端語(yǔ)言,需要 Apache 或者 Nginx 開(kāi)啟 HTTP 服務(wù)。然而我們的 Node 不需要:
~~~
var http = require("http");
復(fù)制代碼
~~~
2. **然后**,開(kāi)啟 HTTP 服務(wù),并設(shè)置開(kāi)啟的端口:
~~~
/**
* req 獲取 url 信息 (request)
* res 瀏覽器返回響應(yīng)信息 (response)
*/
http.createServer(function (req, res) {
// ... 步驟 3 代碼
}).listen(3000); // 監(jiān)聽(tīng)的端口
復(fù)制代碼
~~~
3. **接著**,我們?cè)O(shè)置 HTTP 頭部,并往頁(yè)面打印值,最后結(jié)束響應(yīng):
~~~
// 設(shè)置 HTTP 頭部,狀態(tài)碼是 200,文件類(lèi)型是 html,字符集是 utf8
res.writeHead(200, {
"Content-Type": "text/html;charset=UTF-8"
});
// 往頁(yè)面打印值
res.write('<h1 style="text-align:center">Hello NodeJS</h1>');
// 結(jié)束響應(yīng)
res.end();
~~~
~~~
// 1. 引入 url 模塊
var url = require("url");
// 2. 引入 http 模塊
var http = require("http");
// 3. 用 http 模塊創(chuàng)建服務(wù)
/**
* req 獲取 url 信息 (request)
* res 瀏覽器返回響應(yīng)信息 (response)
*/
http.createServer(function (req, res) {
// 4. 獲取服務(wù)器請(qǐng)求
/**
* 訪問(wèn)地址是:http://localhost:3000/?userName=jsliang&userAge=23
* 如果你執(zhí)行 console.log(req.url),它將執(zhí)行兩次,分別返回下面的信息:
* / ?userName=jsliang&userAge=23
* / /favicon.ico
* 這里為了防止重復(fù)執(zhí)行,所以排除 req.url == /favicon.ico 的情況
*/
if(req.url != "/favicon.ico") {
// 5. 使用 url 的 parse 方法
/**
* parse 方法需要兩個(gè)參數(shù):
* 第一個(gè)參數(shù)是地址
* 第二個(gè)參數(shù)是 true 的話(huà)表示把 get 傳值轉(zhuǎn)換成對(duì)象
*/
var result = url.parse(req.url, true);
console.log(result);
/**
* Url {
* protocol: null,
* slashes: null,
* auth: null,
* host: null,
* port: null,
* hostname: null,
* hash: null,
* search: '?userName=jsliang&userAge=23',
* query: { userName: 'jsliang', userAge: '23' },
* pathname: '/',
* path: '/?userName=jsliang&userAge=23',
* href: '/?userName=jsliang&userAge=23' }
*/
console.log(result.query.userName); // jsliang
console.log(result.query.userAge); // 23
}
// 設(shè)置 HTTP 頭部,狀態(tài)碼是 200,文件類(lèi)型是 html,字符集是 utf8
res.writeHead(200, {
"Content-Type": "text/html;charset=UTF-8"
});
// 往頁(yè)面打印值
res.write('<h1 style="text-align:center">Hello NodeJS</h1>');
// 結(jié)束響應(yīng)
res.end();
}).listen(3000);
復(fù)制代碼
~~~
?在上面的代碼中:
?**首先**,我們引入該章節(jié)的主角 `url` 模塊:
~~~
// 1. 引入 url 模塊
var url = require("url");
復(fù)制代碼
~~~
?**然后**,我們引入 `http` 模塊:
~~~
// 2. 引入 http 模塊
var http = require("http");
復(fù)制代碼
~~~
?**接著**,我們創(chuàng)建 `http` 模塊,因?yàn)?`url` 的監(jiān)聽(tīng),需要 `http` 模塊的開(kāi)啟:
~~~
// 3. 用 http 模塊創(chuàng)建服務(wù)
/**
* req 獲取 url 信息 (request)
* res 瀏覽器返回響應(yīng)信息 (response)
*/
http.createServer(function (req, res) {
// ... 第 4 步、第 5 步代碼
// 設(shè)置 HTTP 頭部,狀態(tài)碼是 200,文件類(lèi)型是 html,字符集是 utf8
res.writeHead(200, {
"Content-Type": "text/html;charset=UTF-8"
});
// 往頁(yè)面打印值
res.write('<h1 style="text-align:center">Hello NodeJS</h1>');
// 結(jié)束響應(yīng)
res.end();
}).listen(3000);
~~~
## URL模塊
URL 模塊是什么呢?
我們?cè)诳刂婆_(tái)(終端)開(kāi)啟 Node 模式,并打印出`url`來(lái)看一下:
好家伙,它有`Url`、`parse`、`resolve`、`resolveObject`、`format`、`URL`、`URLSearchParams`、`domainToASCII`、`domainToUnicode`這么多模塊。
那么,這些模塊都有什么用呢?
### 引入代碼url.js
```
// 1. 引入 url 模塊
var url = require("url");
// 2. 引入 http 模塊
var http = require("http");
// 3. 用 http 模塊創(chuàng)建服務(wù)
/**
* req 獲取 url 信息 (request)
* res 瀏覽器返回響應(yīng)信息 (response)
*/
http.createServer(function (req, res) {
// 4. 獲取服務(wù)器請(qǐng)求
/**
* 訪問(wèn)地址是:http://localhost:3000/?userName=jsliang&userAge=23
* 如果你執(zhí)行 console.log(req.url),它將執(zhí)行兩次,分別返回下面的信息:
* / ?userName=jsliang&userAge=23
* / /favicon.ico
* 這里為了防止重復(fù)執(zhí)行,所以排除 req.url == /favicon.ico 的情況
*/
if(req.url != "/favicon.ico") {
// 5. 使用 url 的 parse 方法
/**
* parse 方法需要兩個(gè)參數(shù):
* 第一個(gè)參數(shù)是地址
* 第二個(gè)參數(shù)是 true 的話(huà)表示把 get 傳值轉(zhuǎn)換成對(duì)象
*/
var result = url.parse(req.url, true);
console.log(result);
/**
* Url {
* protocol: null,
* slashes: null,
* auth: null,
* host: null,
* port: null,
* hostname: null,
* hash: null,
* search: '?userName=jsliang&userAge=23',
* query: { userName: 'jsliang', userAge: '23' },
* pathname: '/',
* path: '/?userName=jsliang&userAge=23',
* href: '/?userName=jsliang&userAge=23' }
*/
console.log(result.query.userName); // jsliang
console.log(result.query.userAge); // 23
}
// 設(shè)置 HTTP 頭部,狀態(tài)碼是 200,文件類(lèi)型是 html,字符集是 utf8
res.writeHead(200, {
"Content-Type": "text/html;charset=UTF-8"
});
// 往頁(yè)面打印值
res.write('<h1 style="text-align:center">Hello NodeJS</h1>');
// 結(jié)束響應(yīng)
res.end();
}).listen(3000);
```
在上面的代碼中:
?**首先**,我們引入該章節(jié)的主角 `url` 模塊:
~~~
// 1. 引入 url 模塊
var url = require("url");
復(fù)制代碼
~~~
?**然后**,我們引入 `http` 模塊:
~~~
// 2. 引入 http 模塊
var http = require("http");
復(fù)制代碼
~~~
?**接著**,我們創(chuàng)建 `http` 模塊,因?yàn)?`url` 的監(jiān)聽(tīng),需要 `http` 模塊的開(kāi)啟:
~~~
// 3. 用 http 模塊創(chuàng)建服務(wù)
/**
* req 獲取 url 信息 (request)
* res 瀏覽器返回響應(yīng)信息 (response)
*/
http.createServer(function (req, res) {
// ... 第 4 步、第 5 步代碼
// 設(shè)置 HTTP 頭部,狀態(tài)碼是 200,文件類(lèi)型是 html,字符集是 utf8
res.writeHead(200, {
"Content-Type": "text/html;charset=UTF-8"
});
// 往頁(yè)面打印值
res.write('<h1 style="text-align:center">Hello NodeJS</h1>');
// 結(jié)束響應(yīng)
res.end();
}).listen(3000);
~~~
```
// 4. 獲取服務(wù)器請(qǐng)求
/**
* 訪問(wèn)地址是:http://localhost:3000/?userName=jsliang&userAge=23
* 如果你執(zhí)行 console.log(req.url),它將執(zhí)行兩次,分別返回下面的信息:
* / ?userName=jsliang&userAge=23
* / /favicon.ico
* 這里為了防止重復(fù)執(zhí)行,所以排除 req.url == /favicon.ico 的情況
*/
if(req.url != "/favicon.ico") {
// 5. 使用 url 的 parse 方法
/**
* parse 方法需要兩個(gè)參數(shù):
* 第一個(gè)參數(shù)是地址
* 第二個(gè)參數(shù)是 true 的話(huà)表示把 get 傳值轉(zhuǎn)換成對(duì)象
*/
var result = url.parse(req.url, true);
console.log(result);
/**
* Url {
* protocol: null,
* slashes: null,
* auth: null,
* host: null,
* port: null,
* hostname: null,
* hash: null,
* search: '?userName=jsliang&userAge=23',
* query: { userName: 'jsliang', userAge: '23' },
* pathname: '/',
* path: '/?userName=jsliang&userAge=23',
* href: '/?userName=jsliang&userAge=23' }
*/
console.log(result.query.userName); // jsliang
console.log(result.query.userAge); // 23
}
```
從中,我們可以看出,我們可以通過(guò) `query`,獲取到我們想要的路徑字段。
?當(dāng)然,上面只講解了 `parse` 的用法,我們可以將上面代碼中 `if` 語(yǔ)句里面的代碼全部清空。然后,輸入下面的內(nèi)容,去學(xué)習(xí) `url` 模塊更多的內(nèi)容:
1. url 模塊所有內(nèi)容:
~~~
console.log(url);
/**
* Console:
{
Url: [Function: Url],
parse: [Function: urlParse], // 獲取地址信息
resolve: [Function: urlResolve], // 追加或者替換地址
resolveObject: [Function: urlResolveObject],
format: [Function: urlFormat], // 逆向 parse,根據(jù)地址信息獲取原 url 信息
URL: [Function: URL],
URLSearchParams: [Function: URLSearchParams],
domainToASCII: [Function: domainToASCII],
domainToUnicode: [Function: domainToUnicode]
}
*/
復(fù)制代碼
~~~
2. parse 如何使用
~~~
console.log(url.parse("http://www.baidu.com"));
/**
* Console:
Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'www.baidu.com',
port: null,
hostname: 'www.baidu.com',
hash: null,
search: null,
query: null,
pathname: '/',
path: '/',
href: 'http://www.baidu.com/'
}
*/
復(fù)制代碼
~~~
3. parse 帶參數(shù):
~~~
console.log(url.parse("http://www.baidu.com/new?name=zhangsan"));
/**
* Console:
Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'www.baidu.com',
port: null,
hostname: 'www.baidu.com',
hash: null,
search: '?name=zhangsan',
query: 'name=zhangsan',
pathname: '/new',
path: '/new?name=zhangsan',
href: 'http://www.baidu.com/new?name=zhangsan'
}
*/
復(fù)制代碼
~~~
4. `format` 的使用:
~~~
console.log(url.format({
protocol: 'http:',
slashes: true,
auth: null,
host: 'www.baidu.com',
port: null,
hostname: 'www.baidu.com',
hash: null,
search: '?name=zhangsan',
query: 'name=zhangsan',
pathname: '/new',
path: '/new?name=zhangsan',
href: 'http://www.baidu.com/new?name=zhangsan'
}))
// Console:
// http://www.baidu.com/new?name=zhangsan
復(fù)制代碼
~~~
5. `resolve` 的使用:
~~~
console.log(url.resolve("http://www.baidu.com/123", "222"));
// Console:
// http://www.baidu.com/222
~~~
## NPM
* `npm -v`:查看 npm 版本。
* `npm list`:查看當(dāng)前目錄下都安裝了哪些 npm 包。
* `npm info 模塊`:查看該模塊的版本及內(nèi)容。
* `npm i 模塊@版本號(hào)`:安裝該模塊的指定版本。
?在平時(shí)使用 npm 安裝包的過(guò)程中,你可能需要知道一些 npm 基本知識(shí):
* `i`/`install`:安裝。使用 `install` 或者它的簡(jiǎn)寫(xiě) `i`,都表明你想要下載這個(gè)包。
* `uninstall`:卸載。如果你發(fā)現(xiàn)這個(gè)模塊你已經(jīng)不使用了,那么可以通過(guò) `uninstall` 卸載它。
* `g`:全局安裝。表明這個(gè)包將安裝到你的計(jì)算機(jī)中,你可以在計(jì)算機(jī)任何一個(gè)位置使用它。
* `--save`/`-S`:通過(guò)該種方式安裝的包的名稱(chēng)及版本號(hào)會(huì)出現(xiàn)在 `package.json` 中的 `dependencies` 中。`dependencies` 是需要發(fā)布在生成環(huán)境的。例如:`ElementUI` 是部署后還需要的,所以通過(guò) `-S` 形式來(lái)安裝。
* `--save-dev`/`-D`:通過(guò)該種方式安裝的包的名稱(chēng)及版本號(hào)會(huì)出現(xiàn)在 `package.json` 中的 `devDependencies` 中。`devDependencies` 只在開(kāi)發(fā)環(huán)境使用。例如:`gulp` 只是用來(lái)壓縮代碼、打包的工具,程序運(yùn)行時(shí)并不需要,所以通過(guò) `-D` 形式來(lái)安裝。
?例子:
* `cnpm i webpack-cli -D`
* `npm install element-ui -S`
?那么,這么多的 npm 包,我們通過(guò)什么管理呢?
?答案是 `package.json`。
?如果我們需要?jiǎng)?chuàng)建 `package.json`,那么我們只需要在指定的包管理目錄(例如 `node_modules`)中通過(guò)以下命名進(jìn)行生成:
* `npm init`:按步驟創(chuàng)建 `package.json`。
* `npm init --yes`:快速創(chuàng)建 `package.json`
?當(dāng)然,因?yàn)閲?guó)內(nèi)網(wǎng)絡(luò)環(huán)境的原因,有些時(shí)候通過(guò) npm 下載包,可能會(huì)很慢或者直接卡斷,這時(shí)候就要安裝淘寶的 npm 鏡像:cnpm
* `npm install -g cnpm --registry=https://registry.npm.taobao.org`
## fs文件管理
* `fs.stat` 檢測(cè)是文件還是目錄
* `fs.mkdir` 創(chuàng)建目錄
* `fs.writeFile` 創(chuàng)建寫(xiě)入文件
* `fs.appendFile` 追加文件
* `fs.readFile` 讀取文件
* `fs.readdir` 讀取目錄
* `fs.rename` 重命名
* `fs.rmdir` 刪除目錄
* `fs.unlink` 刪除文件
我們嘗試通過(guò) `fs.mkdir` 創(chuàng)建目錄:
> 05\_fs.js
~~~
// 2. fs.mkdir
let fs = require('fs');
/**
* 接收參數(shù)
* path - 將創(chuàng)建的目錄路徑
* mode - 目錄權(quán)限(讀寫(xiě)權(quán)限),默認(rèn) 0777
* callback - 回調(diào),傳遞異常參數(shù) err
*/
fs.mkdir('css', (err) => {
if(err) {
console.log(err);
return false;
} else {
console.log("創(chuàng)建目錄成功!");
// Console:創(chuàng)建目錄成功!
}
})
復(fù)制代碼
~~~
?通過(guò) `node 05_fs.js`,我們發(fā)現(xiàn)目錄中多了一個(gè) `css` 文件夾。
?**那么**,有創(chuàng)建就有刪除,創(chuàng)建的目錄如何刪除呢?這里講解下 `fs.rmdir`:
> 05\_fs.js
~~~
// 8. fs.rmdir
let fs = require('fs');
/**
* 接收參數(shù)
* path - 將創(chuàng)建的目錄路徑
* mode - 目錄權(quán)限(讀寫(xiě)權(quán)限),默認(rèn) 0777
* callback - 回調(diào),傳遞異常參數(shù) err
*/
fs.rmdir('css', (err) => {
if(err) {
console.log(err);
return false;
} else {
console.log("創(chuàng)建目錄成功!");
// Console:創(chuàng)建目錄成功!
}
})
復(fù)制代碼
~~~
?通過(guò) `node 05_fs.js`,我們發(fā)現(xiàn)目錄中的 `css` 文件夾被刪除了。
?**接著**,我們通過(guò) `fs.writeFile` 來(lái)創(chuàng)建寫(xiě)入文件:
> 05\_fs.js
~~~
// 3. fs.writeFile
let fs = require('fs');
/**
* filename (String) 文件名稱(chēng)
* data (String | Buffer) 將要寫(xiě)入的內(nèi)容,可以是字符串或者 buffer 數(shù)據(jù)。
* · encoding (String) 可選。默認(rèn) 'utf-8',當(dāng) data 是 buffer 時(shí),該值應(yīng)該為 ignored。
* · mode (Number) 文件讀寫(xiě)權(quán)限,默認(rèn) 438。
* · flag (String) 默認(rèn)值 'w'。
* callback { Function } 回調(diào),傳遞一個(gè)異常參數(shù) err。
*/
fs.writeFile('index.js', 'Hello jsliang', (err) => {
if(err) {
console.log(err);
return false;
} else {
console.log('寫(xiě)入成功!');
}
})
復(fù)制代碼
~~~
?值得注意的是,這樣的寫(xiě)入,是清空原文件中的所有數(shù)據(jù),然后添加 `Hello jsliang` 這句話(huà)。即:存在即覆蓋,不存在即創(chuàng)建。
?有創(chuàng)建就有刪除,感興趣的可以使用 `fs.unlink` 進(jìn)行文件的刪除,再次不做過(guò)多講解。
?**既然**,上面的是覆蓋文件,那么有沒(méi)有追加文件呢?有的,使用 `fs.appendFile` 吧:
> 05\_fs.js
~~~
// 4. fs.appendFile
let fs = require('fs');
fs.appendFile('index.js', '這段文本是要追加的內(nèi)容', (err) => {
if(err) {
console.log(err);
return false;
} else {
console.log("追加成功");
}
})
復(fù)制代碼
~~~
?這樣,我們就成功往里面追加了一段話(huà),從而使 `index.js` 變成了:
> index.js
~~~
Hello jsliang這段文本是要追加的內(nèi)容
復(fù)制代碼
~~~
?**在上面**,我們已經(jīng)做了:新增、修改、刪除操作。那么小伙伴一定很熟悉下一步驟是做什么了:
* `fs.readFile` 讀取文件
* `fs.readdir` 讀取目錄
> 05\_fs.js
~~~
let fs = require('fs');
// 5. fs.readFile
fs.readFile('index.js', (err, data) => {
if(err) {
console.log(err);
return false;
} else {
console.log("讀取文件成功!");
console.log(data);
// Console:
// 讀取文件成功!
// <Buffer 48 65 6c 6c 6f 20 6a 73 6c 69 61 6e 67 e8 bf 99 e6 ae b5 e6 96 87 e6 9c ac e6 98 af e8 a6 81 e8 bf bd e5 8a a0 e7 9a 84 e5 86 85 e5 ae b9>
}
})
// 6. fs.readdir 讀取目錄
fs.readdir('node_modules', (err, data) => {
if(err) {
console.log(err);
return false;
} else {
console.log("讀取目錄成功!");
console.log(data);
// Console:
// 讀取目錄成功!
// [ '03_tool-multiply.js', 'jsliang-module' ]
}
})
復(fù)制代碼
~~~
### rename重命名
~~~
let fs = require('fs');
// 7. fs.rename 重命名
fs.rename('index.js', 'jsliang.js', (err) => {
if(err) {
console.log(err);
return false;
} else {
console.log("重命名成功!");
}
})
復(fù)制代碼
~~~
?當(dāng)然,如果 `fs.rename` 還有更勁爆的功能:剪切
> _fs.js
~~~
let fs = require('fs');
// 7. fs.rename 重命名
fs.rename('jsliang.js', 'node_modules/jsliang.js', (err) => {
if(err) {
console.log(err);
return false;
} else {
console.log("剪切成功!");
}
})
~~~
- 前言
- 你真的懂This嗎?
- 對(duì)象和對(duì)象構(gòu)造函數(shù)
- 工廠功能和模塊模式
- API的使用
- async and await
- 關(guān)于async的很棒的一篇文章
- 掘金:關(guān)于forEach,map,fiter循環(huán)操作
- Node.js 實(shí)例與基礎(chǔ)
- 原創(chuàng): Express 學(xué)習(xí)使用筆記
- 零碎知識(shí)點(diǎn)方法
- 關(guān)于滾動(dòng)吸頂?shù)姆椒?/a>
- Vue學(xué)習(xí)筆記
- Vue向?qū)?/a>
- vuex是啥?
- vue代碼風(fēng)格指南
- 關(guān)于vue的初體驗(yàn)
- 超詳細(xì)解毒Vue
- Vue實(shí)例
- 模版語(yǔ)言
- 組件基礎(chǔ)
- 條件渲染、列表渲染、Class與style綁定
- Todolist的制作超詳細(xì)
- vue-router
- Vue基礎(chǔ)2.0x 筆記
- 搭建vuepress
- JavaScript之ES6
- 箭頭函數(shù)
- 這就是This
