1. 程式人生 > 其它 >Node.js部分模組

Node.js部分模組

Node.js —— 模組

一、模組

1. 描述

module.exports = 物件 預設是一個空物件,用於匯出該模組中的內容
require() 是一個全域性函式,用於引入其他模組,返回模組匯出的物件
__dirname 是模組中的區域性變數,獲取當前模組的絕對路徑
__filename 是模組中的區域性變數,獲取當前模組的絕對路徑和模組名稱

2. 程式碼演示

  1. 被匯入模組 eye.js
console.log('眼部模組被匯入了');
var a = 2;
function fn() {
    return 4;
}
module.exports = {
    mya: a,
    myfn: fn
}
  1. head.js
var myEye = require('./eye.js');
console.log(myEye.mya); // 2
console.log(myEye.myfn()); // 4
console.log(__dirname); // C:\Users\web\Desktop\node.js測試
console.log(__filename); // C:\Users\web\Desktop\node.js測試\head.js

二、模組分類

以路徑開頭 不以路徑開頭
檔案模組 require('./circle.js'),用於引入自定義模組 require('url')
,用於引入官方核心模組
目錄模組 require('./02_tao'),會到目錄下尋找package.json檔案中main屬性對應的檔案,如果找不到會自動尋找index.js require('tao'),用於引入第三方模組,首先會到當前目錄下的node_modules目錄中尋找tao,如果找不到,會一直往上一級目錄下尋找

三、下載第三方模組

1. 概念

commonJS :是一種規範,制定了模組的引入和匯出規範,Node.js下模組概念基於這種規範
包 (package) :指第三方模組,都是目錄模組形式
npm :用於管理第三方模組的工具,包括下載安裝、升級、解除安裝、上傳...會在nodejs安裝時附帶安裝

2. 基本命令

  • npm init -y —— 初始化一個專案說明檔案
  • npm install 包的名稱 —— 下載安裝指定的包,會將包下載到當前目錄下的node_modules中,如果node_modules不存在,會自動建立;會自動生成一個package-lock.json用於記錄安裝的包的名稱和版本號(鎖定包的版本號)。同時會在package.json中記錄下載的這個包的名稱和版本號。
  • npm install —— 自動安裝package.json和package-lock.json中記錄的包
  • npx -p node@版本號 node 檔名稱 —— 先下載安裝指定版本的Node.js,下載成功後,再使用這個版本的Node.js執行檔案,執行成功後就刪除這個版本的Node.js
  • npm config get registry —— 獲取當前下載倉庫的地址
  • npm config set registry http://registry.npm.taobao.org —— 設定下載的倉庫地址為淘寶映象(改為國內伺服器)

三、官方核心模組

1. querystring

  1. 描述
    查詢字串是瀏覽器向伺服器端傳遞資料的一種方式,位於URL(統一資源定位)中
  2. 解析查詢字串 —— parse
// 1. 引入查詢字串模組
const querystring = require('querystring');  // 原始碼:lib/querystring.js
// 2. 查詢字串
let str = 'keyword=筆記本&price=4199&enc=utf-8';
// 3. 使用查詢字串模組解析為物件
let obj = querystring.parse(str);
console.log(obj); // [Object: null prototype] { keyword: '筆記本', price: '4199', enc: 'utf-8' }
console.log(obj.keyword, obj.price, obj.enc);

2. url

  1. 描述
    URL:統一資源定位符,網際網路上任何內容都有一個對應的網址可以訪問到,這個網址就叫URL
  2. 解析URL
//引入URL模組
const url=require('url');
const querystring=require('querystring');
let str='http://www.codeboy.com:9999/product_details.html?lid=18';
//使用URL模組解析URL
let obj=url.parse(str);
console.log(obj);
/*
Url {
  protocol: 'http:',
  slashes: true,
  auth: null,
  host: 'www.codeboy.com:9999',
  port: '9999',
  hostname: 'www.codeboy.com',
  hash: null,
  search: '?lid=18',
  query: 'lid=18',
  pathname: '/product_details.html',
  path: '/product_details.html?lid=18',
  href: 'http://www.codeboy.com:9999/product_details.html?lid=18' }
*/

3. fs

const fs = require('fs');

  1. 建立目錄
// 同步
fs.mkdirSync('./mydir');
// 非同步
fs.mkdir('./mydir', function(err) {
    if (err) throw err;
    console.log('建立成功');
});
  1. 移除空目錄
fs.rmdirSync('./mydir');
fs.rmdir('./mydir', function(err) {
    if (err) throw err;
    console.log('成功刪除空目錄');
});
  1. 檢視檔案狀態
// 同步
var result = fs.statSync('./mydir');
// 非同步
fs.stat('./mydir', function(err, res) {
    if (err) throw err;
    console.log(res);
    console.log(res.isFile()); // false
    console.log(res.isDirectory()); // true
})
  1. 讀取目錄
// 同步(只能讀取當前這一層的檔名和目錄名,思考:如何遞迴讀取檔案)
var res = fs.readdirSync('./');
// 非同步
fs.readdir('./', function(err, res) {
    if (err) throw err;
    console.log(res); // [ 'file.js', 'mydir' ]
})
  1. 覆蓋寫入檔案
/* 
如果檔案不存在,會先建立檔案然後寫入資料;
如果檔案已經存在,會先清空檔案中的內容然後寫入資料。
*/
// 同步
fs.writeFileSync('./mydir/1.txt', '123');
// 非同步
fs.writeFile('./mydir/1.txt', '456', function(err) {
    if (err) throw err;
    console.log('覆蓋修改成功');
})
  1. 追加寫入檔案
/* 
如果檔案不存在,會先建立檔案然後寫入資料;
如果檔案已經存在,會在檔案末尾追加寫入資料。
*/
// 同步
fs.appendFileSync('./mydir/1.txt', '789');
// 非同步
fs.appendFile('./mydir/1.txt', '789', function(err) {
    if (err) throw err;
    console.log('追加修改成功');
})
  1. 讀取檔案內容
// 同步
var res = fs.readFileSync('./mydir/1.txt');
// 非同步
fs.readFile('./mydir/1.txt', function(err, res) {
    if (err) throw err;
    console.log(res); // <Buffer 34 35 36 37 38 39 37 38 39>
})
  1. 刪除檔案
// 只能用於刪除檔案,思考:刪除目錄?
// 同步
fs.unlinkSync('./mydir/1.txt');
// 非同步
fs.unlink('./mydir/1.txt', function(err) {
    if (err) throw err;
    console.log('成功刪除檔案');
})
  1. 檢測檔案(目錄)是否存在
// 同步
var res1 = fs.existsSync('./mydir');
var res2 = fs.existsSync('./file.js');
console.log(res1, res2); // false true
// 非同步
fs.exists('./mydir', function(res) {
    console.log(res);
})
  1. 拷貝檔案
// 同步
if (fs.existsSync('./mydir')) fs.copyFileSync('./mydir/1.txt', './2.txt');
// 非同步
fs.copyFile('./mydir/1.txt', './6.txt', function(err) {
    if (!fs.existsSync('./mydir/1.txt')) return;
    if (err) throw err;
})
  1. 流 stream
// 1. 建立可讀取的檔案流
let rs = fs.createReadStream('./mydir/1.txt');
// 事件:監聽是否有資料流入
// on(事件名稱, 回撥函式) —— 新增事件
// data 固定,表示一旦有資料流入,自動通過回撥函式獲取
/*
let count = 0;  // 用於統計次數
rs.on('data', (chunk) => {
	// chunk表示分段的資料
	// console.log(chunk);
	count++;  // 讀取一段,記錄一次
});
// 新增讀取結束:一旦讀取結束,呼叫回撥函式
rs.on('end', () => {
	console.log(count);
});
*/
// 2. 建立可寫入的流
let ws = fs.createWriteStream('./2.zip');
// 3. 把讀取的檔案流通過管道新增到寫入的檔案流
// 最終完成檔案拷貝
rs.pipe(ws);