Node.js Learning
1. 命令行
1. 環(huán)境變量 => path
當(dāng)我們?cè)诿钚写翱诖蜷_(kāi)一個(gè)文件缨该,或調(diào)用一個(gè)程序時(shí),系統(tǒng)回收現(xiàn)在當(dāng)前目錄下尋找文件程序川背,如果找到了則直接打開(kāi)贰拿,如果沒(méi)有找到,會(huì)依次在環(huán)境變量
Path
中尋找熄云,直到找到為止膨更,如果沒(méi)找到就報(bào)錯(cuò)。相似:作用域
var a = 100;
function fn() {
var a = 200;
function fn2() {
var a = 300;
console.log(a);
}
}
fn()
// 此時(shí) a = 300
var a = 100;
function fn() {
var a = 200;
function fn2() {
// var a = 300;
console.log(a);
}
}
fn()
// 此時(shí) a = 200
var a = 100;
function fn() {
// var a = 200;
function fn2() {
// var a = 300;
console.log(a);
}
}
fn()
// 此時(shí) a = 100
- 可以將經(jīng)常需要訪問(wèn)的程序和文件的路徑添加到
path
中
2. 進(jìn)程和線程
1. 進(jìn)程
進(jìn)程負(fù)責(zé)位程序的運(yùn)行提供必備的環(huán)境
進(jìn)程相當(dāng)于工廠中的車間
2. 線程
線程是計(jì)算機(jī)中最小的計(jì)算單位缴允,線程負(fù)責(zé)執(zhí)行進(jìn)程中的程序
線程相當(dāng)于工廠中的工人
- 單線程
js
是單線程chrome
是單線程
- 多線程
- 性能相較于單線程好
2. Node.js 簡(jiǎn)介
1. 概念
- 一個(gè)能夠在服務(wù)器端運(yùn)行
js
的開(kāi)放源代碼荚守,跨平臺(tái)js
運(yùn)行環(huán)境
[圖片上傳失敗...(image-830446-1599101590389)]
P.s: - 服務(wù)器響應(yīng)速度:帶寬
2. 模塊化
如果程序設(shè)計(jì)的規(guī)模達(dá)到一定程度,則需要對(duì)其進(jìn)行模塊化管理
模塊化可以有多種形式,但直到應(yīng)該提供能夠?qū)⒋a分割為多個(gè)源文件的機(jī)制
CommonJS
的模塊功能可以幫我們解決該問(wèn)題
3. Common JS
主要是為了彌補(bǔ)
js
沒(méi)有標(biāo)準(zhǔn)的缺陷能夠在任何地方運(yùn)行
-
定義:
引用
定義
表示
3. 什么是模塊
- 在
Node
中矗漾,一個(gè)js
文件就是一個(gè)模塊
4. 引入其他模塊
通過(guò)
require("")
函數(shù)引入外部的模塊require("")
可以傳遞一個(gè)文件的路勁作為參數(shù)锈候,node
會(huì)自動(dòng)引入外部模塊這里路徑,如果使用相對(duì)路徑缩功,必須使用
./..
開(kāi)頭使用
require("")
引入模塊后晴及,該函數(shù)會(huì)返回一個(gè)對(duì)象,這個(gè)對(duì)象代表的是引入的模塊在
node
中嫡锌,每一個(gè)js
代碼都是獨(dú)立運(yùn)行在一個(gè)函數(shù)中虑稼,而不是全局中。所以每一個(gè)模塊中的變量和函數(shù)在其他模塊中無(wú)法訪問(wèn)
5. 向外部暴露屬性或方法
可以通過(guò)
exports
向外部暴露變量和方法只需要將暴露給外部的變量或方法設(shè)置為
export
的屬性即可
6. 模塊標(biāo)識(shí)
就是模塊的名字,也就是傳遞給
require("")
方法的參數(shù),它必須是符合駝峰命名法的字符串,或者是仙骨笛路徑或絕對(duì)路徑模塊互不干擾
通過(guò)模塊表示找到我們的模塊
-
分類:
-
核心模塊
由
node
引擎提供的模塊核心模塊就是引入模塊的名字
-
文件模塊
由用戶自己創(chuàng)建的模塊
模塊標(biāo)識(shí)就是文件的路徑 (絕對(duì)路徑,相對(duì)路徑)
-
在
node
中有一個(gè)全局對(duì)象global
,他的作用和網(wǎng)頁(yè)中window
類似.在全局中創(chuàng)建的變量都會(huì)作為
global
的屬性保存在全局中創(chuàng)建的函數(shù)都會(huì)作為
global
的方法保存當(dāng)
node
在執(zhí)行模塊中的代碼時(shí),他會(huì)首先在代碼的最頂部添加函數(shù)代碼
function (exports, require, module, __filename, __dirname){}
實(shí)際上模塊中的代碼都是包裝在一個(gè)函數(shù)中指向的,并且在函數(shù)在執(zhí)行時(shí),同時(shí)傳遞了 5 個(gè)實(shí)參:
exports
: 將函數(shù)和對(duì)象暴露到外部
require
: 函數(shù): 用來(lái)引入外部的模塊
module
: 模塊: 代表的是當(dāng)前模塊本身 (exports 就是 module 的屬性exports == module.exports
)P.s. : 通過(guò)
exports
只能使用.
的方式來(lái)向外暴露exports.age = 10;
exports.sayName = function() {
console.log("I'm Sun wukong.");
}</pre>通過(guò)
module.exports
既可以.
, 也可以直接賦值module.exports = {
name: "Zhu bajie",
age: 34,
sayName: function() {
console.log("I'm Zhu bajie");
}
}</pre>
__filename __
: 當(dāng)前模塊完整文件路徑
dirname
: 當(dāng)前模塊文件夾路徑
console.log(arguments)
為
js
中封裝實(shí)際參數(shù)的變量,可以通過(guò)打印此變量得到所有的局部變量
console.log(arguments.callee)
保存的是當(dāng)前執(zhí)行的函數(shù)對(duì)象
/* E:\NodeJS_Learning\code\module\04.module.js **/
var a = 10;
// 全局變量
b = 20;
console.log(global);
// 封裝實(shí)際參數(shù)的 arguments
console.log(arguments);
// 保存的是當(dāng)前執(zhí)行的函數(shù)對(duì)象
console.log(arguments.callee + "");
/* 執(zhí)行結(jié)果 **/
/*
說(shuō)明每個(gè)模塊中的變量都相當(dāng)于在一個(gè)函數(shù)中執(zhí)行
**/
function (exports, require, module, __filename, __dirname) {
var a = 10;
?
// 全局變量
b = 20;
?
console.log(global);
?
// 封裝實(shí)際參數(shù)的 arguments
console.log(arguments);
// 保存的是當(dāng)前執(zhí)行的函數(shù)對(duì)象
console.log(arguments.callee + "");
?
}
7. Package
CommonJS
的包規(guī)范允許我們將一組相關(guān)的模塊組合到一起,形成一組完整的工具CommonJS
的包規(guī)范由包結(jié)構(gòu)和包描述文件兩個(gè)部分組成-
包結(jié)構(gòu)
用于組織包中的各種文件
-
包實(shí)際上就是一個(gè)壓縮文件,解壓后還原為目錄.符合規(guī)范的目錄,應(yīng)該包含如下文件:
package.json
: 描述文件bin
: 可執(zhí)行二進(jìn)制文件lib
:js
代碼doc
: 文檔test
: 單元測(cè)試
-
包描述文件
描述報(bào)的相關(guān)信息,以提供外部讀取分析
用來(lái)表達(dá)非代碼相關(guān)的信息势木,是一個(gè)
JSON
格式的文件位于包的根目錄下
-
字段:
- name, description, version, keywords, maintainers, contributors, bugs, licenses, repositories, dependencies, homepage,
os
,cpu
, engine,builtin
, directories, implements, scripts, author, bin, main,devDependencies
- name, description, version, keywords, maintainers, contributors, bugs, licenses, repositories, dependencies, homepage,
相關(guān)代碼: E:\NodeJS_Learning\code\module
3. NPM (Node Package Manager)
-
npm
幫助node
完成了第三方模塊的發(fā)布蛛倦、安裝和以來(lái)等
1. Commander
npm -v
查看版本npm version
npm search + packageName
npm init
創(chuàng)建package.json
文件npm install/i + packageName
npm install/i + packageName -g
全局安裝
全局安裝的包一般都是一個(gè)工具, 不是在項(xiàng)目中使用的
npm remove/r + packageName
npm install + packageName --save
安裝包并添加到依賴中
添加到依賴后, 下載項(xiàng)目之后, 直接
npm install
就可以直接安裝所有的 package
2. 實(shí)戰(zhàn)
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
?```
```json
Press ^C at any time to quit.
package name: (npm_test)
version: (1.0.0)
description: npm test
entry point: (index.js)
test command:
git repository:
keywords:
author: Simon
license: (ISC)
About to write to E:\NodeJS_Learning\code\npm_test\package.json:
?
{
"name": "npm_test",
"version": "1.0.0",
"description": "npm test",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Simon",
"license": "ISC"
}
?
?
Is this OK? (yes)
?
// 注意:npm 中 package name 嚴(yán)禁使用大寫(xiě)作為名字</pre>
npm init
創(chuàng)建出package.json
{
"name": "npm_test",
"version": "1.0.0",
"description": "npm test",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Simon",
"license": "ISC"
}
下載一個(gè) module => math
?
npm install math
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN npm_test@1.0.0 No repository field.
+ math@0.0.3
added 1 package from 1 contributor in 1.059s
在目錄: E:\NodeJS_Learning\code\npm_test 下,出現(xiàn)了一個(gè)
node_modules
文件夾npm install
的所有package
都會(huì)安裝到這個(gè)文件夾下
創(chuàng)建
index.js
文件作為 package 的入口
/* index.js **/
var math = require("math");
?
console.log(math);
console.log(math.add(1, 3));
執(zhí)行 index.js
E:\NodeJS_Learning\code\npm_test>node index.js
Object [Math] {
samesign: [Function],
copysign: [Function],
add: [Function],
sum: [Function],
mul: [Function],
prod: [Function],
factorial: [Function],
gcd: [Function],
lcm: [Function]
}
4
3. NPM 鏡像服務(wù)器
npm install -g cnpm --registry=https://registry.npm.taobao.org
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated har-validator@5.1.5: this
C:\Users\lenovo\AppData\Roaming\npm\cnpm -> C:\Users\lenovo\AppData\Roaming\npm\node_modules\cnpm\bin\cnpm
+ cnpm@6.1.1
added 685 packages from 970 contributors in 18.679s
具體實(shí)施在目錄:E:\NodeJS_Learning\code\npm_test