1.在本地項目中基於NPM/YARN安裝第三方模塊 package.json 2.安裝在本地和全局的區別 3.NODE入門 NODE本身是基於CommonJS模塊規範設計的,所以模塊是NODE的組成 內置模塊:NODE天生提供給JS調取使用的 第三方模塊:別人寫好的,我們可以基於NPM安裝使用 自定 ...
1.在本地項目中基於NPM/YARN安裝第三方模塊
第一步:在本地項目中創建一個“package.json”的文件
作用:把當前項目所有依賴的第三方模塊信息(包含:模塊名稱以及版本號等信息)都記錄下來;可以在這裡配置一些可執行的命令腳本等;基於YARN會預設生成一個“配置清單”,只是信息沒有手動創建的全面
npm init -y 或者 yarn init -y
創建配置清單的時候,項目目錄中不應該出現中文和特殊符號,這樣有可能識別不了
第二步:安裝
開發依賴:只有在項目開發階段依賴的第三方模塊
生產依賴:項目部署實施的時候,也需要依賴的第三方模塊[npm]
npm install xxx --save 保存到配置清單的生產依賴中
--save-dev 保存到開發依賴中[yarn]
yarn add xxx 預設就是保存到生產依賴中
--dev / -D 保存到開發依賴中第三步:部署的時候“跑環境”
不要自己一個個的安裝,只需要執行 npm install 或者 yarn install 即可,npm會自己先檢測目錄中是否有package.json文件,如果有的話,會按照文件中的配置清單依次安裝
=>開發一個項目,我們生成一個配置清單“package.json”,當我們安裝第三方模塊使用的時候,把安裝的模塊信息記錄到配置清單中,這樣以後不管是團隊協作開發還是項目部署上線,我們都沒有必要把node_modules發文件發送給別人,只需要把配置清單傳遞給其它人即可,其他人拿到配置清單後,按照清單中依賴項及版本號,重新安裝即可(重新安裝:“跑環境”)
package.json
{
"name": "0609DAY1", //=>模塊名稱
"version": "1.0.0", //=>版本號
"description": "", //=>模塊的描述
"main": "index.js", //=>當前模塊的主入口文件
"dependencies": { //=>生產依賴
"zepto": "^1.2.0"
},
"devDependencies": { //=>開發依賴
},
"scripts": { //=>可執行腳本
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
2.安裝在本地和全局的區別
[安裝在全局的特點]
1.所有的項目都可以使用這個模塊
->容易導致版本衝突
->安裝在全局的模塊,不能基於CommonJS模塊規範調取使用(也就是不能在JS中通過REQUIRE調取使用)[安裝在本地的特點]
1.只能當前項目使用這個模塊
->不能直接的使用命令操作(安裝在全局可以使用命令)
為啥安裝在全局下可以使用命令?
npm root / -g 查看本地項目或者全局環境下,NPM的安裝目錄
安裝在全局目錄下的模塊,但部分都會生成一個xxx.cmd的文件,只要有這個文件,那麼xxx就是一個可執行的命令(例如:yarn.cmd => yarn就是命令)
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\node_modules\yarn\bin\yarn.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\node_modules\yarn\bin\yarn.js" %*
)
能否即安裝在本地,也可以使用命令操作?
可以,但是需要配置package.json中的scripts
1.把模塊安裝在本地,如果是支持命令操作的(會在node_modules的bin中生成xxx.cmd的命令文件,只不過這個文件無法在全局下執行 =>不能直接用命令)
2.在package.json的scripts中配置需要執行的命令腳本
"scripts": {
"zxt": "lessc -v" 屬性名自己設置即可,屬性值是需要執行的命令腳本,根據需要自己編寫(可以配置很多命令的)
}3.npm run zxt / yarn zxt 這樣的操作就是把配置的腳本執行
->首先到配置清單的scripts中查找
->找到把後面對應的屬性值(執行腳本)執行
->執行腳本的時候,會到本地node_modules中的bin文件加查找,沒有的話,在向NPM安裝的全局目錄下查找
3.NODE入門
NODE本身是基於CommonJS模塊規範設計的,所以模塊是NODE的組成
- 內置模塊:NODE天生提供給JS調取使用的
- 第三方模塊:別人寫好的,我們可以基於NPM安裝使用
- 自定義模塊:自己創建一些模塊
CommonJS模塊化設計的思想(AMD/CMD/ES6 MODULE都是模塊設計思想)
1.CommonJS規定,每一個JS都是一個單獨的模塊(模塊是私有的:裡面涉及的值和變數以及函數等都是私有的,和其它JS文件中的內容是不衝突的)
2.CommonJS中可以允許模塊中的方法互相的調用
B模塊中想要調取A模塊中的方法
=>A導出
=>B導入
[導出]
CommonJS給每一個模塊(每個JS)中都設置了內置的變數/屬性/方法
module:代表當前這個模塊[object]
module.exports:模塊的這個“屬性”是用來導出當前模塊的屬性和方法的 [object]
exports:是內置的一個“變數”,也是用來導出當前模塊屬性方法的,雖然和module.exports不就是一個東西,但是對應的值是同一個(module.exports=exports 值都是對象)
[導入]
require:CommonJS提供的內置變數,用來導入模塊的(其實導入的就是module.exports暴露出來的東西);導入的值也是[object]類型的;
CommonJS特點:
1. 所有代碼都運行在模塊作用域,不會污染全局作用域(每一個模塊都是私有的,包括裡面所有的東西也都是私有的,不會和其它模塊產生干擾)
2. 模塊可以多次載入,但是只會在第一次載入時運行一次,然後運行結果就被緩存了,以後再載入,就直接讀取緩存結果。要想讓模塊再次運行,必須清除緩存。(為了保證性能,減少模塊代碼重覆執行的次數)
3. 模塊載入的順序,按照其在代碼中出現的順序。CommonJS規範載入模塊是同步的,也就是說,只有載入完成,才能執行後面的操作。
案例:A/B/C三個模塊
A中有一個sum方法:實現任意數求和
B中有一個avg方法:實現任意數求平均(先求和再求平均:B中用到A)
C中調取B中的avg,實現 12,23,34,45,56,67,78,89 求平均數
require導入規則
require('./xxx') 或者 ../xxx 再或者 /xxx,這種自己制定路徑的模式,都是為了導入自定義的模塊,換句話說,想要導入自定義的模塊,必須加路徑
require('xxx') 首先到當前項目的node_modules中查找是否存在這個模塊,不存在找node提供的內置模塊(導入第三方或者內置的)
__dirname:模塊中這個內置變數是當前模塊所在的絕對路徑(具體到盤符:物理路徑 例如:E:\201802LESSON\WEEK9\0609DAY1; 相對路徑:WEEK9\0609DAY1 相對於根目錄的路徑;)
__filename:相對於__dirname來講,多了模塊名稱,例如:E:\201802LESSON\WEEK9\0609DAY1\C.js
4.NODE中的內置模塊
http://nodejs.cn/api/
【fs內置模塊:實現I/O操作】
let fs = require('fs');
1. fs.mkdir / fs.mkdirSync:創建文件夾,有Sync的是同步創建,反之沒有是非同步,想要實現無阻塞的I/O操作,我們一般都是用非同步操作完成要處理的事情
2. fs.readdir / fs.readdirSync:讀取文件目錄中的內容
3. fs.rmdir :刪除文件夾
4. fs.readFile:讀取文件中的內容
5. fs.writeFile:向文件中寫入內容(覆蓋寫入:寫入的新內容會替換原有的內容)
6. fs.appendFile:追加寫入新內容,原有的內容還在
7. fs.copyFile:拷貝文件到新的位置
8. fs.unlink:刪除文件
...