這里我們學習nodejs的一些關(guān)鍵和基礎(chǔ)的內(nèi)容
npm是什么
-
相信各位大佬都知道npm這個東西锥涕。npm 其實又叫 node package manager,翻譯過來就是node的包管理工具皿淋。它的但是解決了很實際的一些東西。
- 如果有早期做前端的人奥溺,如果用一個庫摔吏,比如jQuery媒怯,就得去它的官網(wǎng)下載它的js文件订讼,并且版本也比較難維護,有些特定版本官網(wǎng)還找不到扇苞。
- 現(xiàn)在有npm就可以很好的解決我們這些實際的問題欺殿。
假設(shè)你想下載一個jQuery來使用,有npm我們可以這樣做鳖敷,直接在控制臺輸入npm i jquery
你會發(fā)現(xiàn)文件夾中多了一個node_modules文件夾脖苏,文件夾內(nèi)就有一個jquery的文件夾屏箍。 - 如果想指定版本蟆豫,那么可以這樣
npm i jquery@1.11.1
。怎么樣是不是比你去官網(wǎng)找再下會快很多啊氨距。
簡單講npm就是一個包維護的一個工具,常用的命令就那么幾個蜒谤,沒什么內(nèi)涵的東西在里面在這列舉一些常用的npm命令,都不用記至扰,你用到就記住了鳍徽。
在項目中初始化一個 package.json 文件
凡是使用 npm 來管理的項目都會有這么一個文件
npm init
# 跳過向?qū)В焖偕?package.json 文件
# 簡寫是 -y
npm init --yes
# 一次性安裝 dependencies 中所有的依賴項
# 簡寫是 npm i
npm install
# 安裝指定的包敢课,可以簡寫為 npm i 包名
# npm 5 以前只下載阶祭,不會保存依賴信息,如果需要保存直秆,則需要加上 `--save` 選項
# npm 5 以后就可以省略 --save 選項了
npm install 包名
# 一次性安裝多個指定包
npm install 包名 包名 包名 ...
# 安裝指定版本的包
npm install 包名@版本號
# npm list命令以樹型結(jié)構(gòu)列出當前項目安裝的所有模塊濒募,以及它們依賴的模塊。
npm list
# 加上global參數(shù)圾结,會列出全局安裝的模塊
npm list -global
# npm list命令也可以列出單個模塊
npm list 包名
# 安裝全局包
npm install --global 包名
# 更新本地安裝的模塊
# 它會先到遠程倉庫查詢最新版本瑰剃,然后查詢本地版本。如果本地版本不存在筝野,或者遠程版本較新晌姚,就會安裝
npm update [package name]
# 升級全局安裝的模塊
npm update -global [package name]
# 卸載指定的包
npm uninstall 包名
# 查看包信息
# view 別名:v、info歇竟、show
npm view 包名
# 查看使用幫助
npm help
# 查看某個命令的使用幫助
# 例如我忘記了 uninstall 命令的簡寫了挥唠,這個時候,可以輸入 `npm uninstall --help` 來查看使用幫助
npm 命令 --help
tips:npm 5 以后就可以省略 --save 選項,自動會給你的package.json中添加包信息了焕议。
- 還有個特殊的假設(shè)你想升級你的npm宝磨,你可以這樣
npm i npm
自己升級自己。 - -global/-g表示的是全局安裝盅安,有些東西可以全局安裝唤锉,比如
nodemon eslint
。全局安裝的包不會在node_modules內(nèi)宽堆。
這里看起來命令很多很長腌紧,其實很多都有簡寫比如:
install/i
、-global/-g
畜隶、uninstall/un
壁肋。
- 解決npm下載慢問題
淘寶有npm官網(wǎng)的同步鏡像,我們可以使用淘寶的鏡像地址籽慢。淘寶鏡像:https://npm.taobao.org/
+ 第一種方法:每次使用npm時指定從何處下載包浸遗。寫法如下:
shell npm i jquery --registry=https://registry.npm.taobao.org
* 但是這樣每次都要手動加--registry=https://registry.npm.taobao.org
非常麻煩
+ 第二種方法:直接使用https://registry.npm.taobao.org為我們的默認地址
```shell
# 配置到淘寶
npm config set registry https://registry.npm.taobao.org
# 查看 registry 是否配置正確
npm config list
```
* 這樣你在使用`npm`的時候,默認就會去淘寶上下載包了箱亿。
+ 第三種方法:全局安裝`cnmp`跛锌,然后用`cnmp`去代替`npm`。
```shell
# 全局安裝cnpm
npm i cnpm -g
#下次使用
cnpm i
```
采用這三種方式都可以解決npm慢的問題届惋。個人正在使用第二種方式髓帽,感覺不錯菠赚。
- package.json和package-lock.json文件的解讀
- package.json文件是記錄你項目的一些基本信息。
- 當沒有時可以使用
npm init
來初始化這個文件郑藏,填寫的都是一些基本信息衡查。項目名、描述等等必盖。 - 你也可以不填寫這些信息拌牲,快速生成該文件可以像這樣
npm init -y
- 當沒有時可以使用
- packages.json中的
scripts
這表示你的執(zhí)行腳本,你可以像這樣
"scripts": { "start": "node ./app.js" },
在這項目的命令行中我輸入
npm start
實際上執(zhí)行的是node ./app.js
歌粥。這樣可以把復雜的啟動腳本簡單化塌忽。-
packages.json中的main。這個相當于入口失驶,比如你引用了
bootstrap
這個庫土居。當var bs = require('bootstrap');
這條語句執(zhí)行時,它會這樣先找node_modules
這個文件夾突勇,當前目錄找不到就向上一級目錄找装盯,直到到找到這個node_modules
這個文件夾,它就在文件夾內(nèi)找bootstrap
這個文件夾甲馋,找到后就到里面找package.json這個文件埂奈,沒找到則找index.js。兩個都沒找到就報錯定躏。找到package.json就在文件內(nèi)找main
账磺,找到后根據(jù)main的值找到文件執(zhí)行。找到index.js則執(zhí)行這個文件痊远。- 說了這么多垮抗,其實main主要是指定入口的文件。
packages.json中dependencies表示你這個項目用到的包碧聪,有可能它會像這樣
"dependencies": { "bootstrap": "^4.1.3", }
- 這表示這個項目使用了bootstrap冒版,并且版本4.1.3以上,^表示是以上的意思逞姿,相當于以上都行辞嗡。
- 這樣就存在一個問題,假設(shè)我這個項目就依賴于某版本的庫那這樣的維護會相對麻煩
npm i
是下載最新的包滞造。所以出現(xiàn)了package-lock.json续室。
- 這樣就存在一個問題,假設(shè)我這個項目就依賴于某版本的庫那這樣的維護會相對麻煩
- package.json文件是記錄你項目的一些基本信息。
- package-lock.json
- 其實package-lock.json主要是用來記錄包的版本,和提升
npm i
的性能谒养。是npm 5 之后才出現(xiàn)的挺狰。- 有這個文件之后庫的版本能得到維護,你再次使用
npm i
時版本還是以前的版本。 - 并且當你沒有node_moudles這個文件夾時丰泊,使用
npm i
的速度會比較快薯定。原因是npm只要讀取package-lock.json這個文件就行了,文件中有包的下載地址和版本會加快下載速度瞳购。
- 有這個文件之后庫的版本能得到維護,你再次使用
- 其實package-lock.json主要是用來記錄包的版本,和提升
npm官網(wǎng):https://www.npmjs.com/ 查找包沉唠,和包簡單的使用非常有用。
初識node之文件操作
- fs模塊異步同步操作文件
+ fs是系統(tǒng)提供的核心模塊苛败,提供了`readFile()`和`readFileSync()`,同步和異步讀取文件径簿。
* 同步會阻塞程序的執(zhí)行罢屈,所以大部分情況推薦使用異步操作,特殊情況除外篇亭。
* 異步操作往往通過回調(diào)函數(shù)來獲取操作的結(jié)果缠捌。
+ fs的常用api
> 更多可以去node官網(wǎng)查看,鏈接:http://nodejs.cn/api/fs.html
Api | 作用 | 注意點 |
---|---|---|
fs.appendFile(file, data, callback) | 向文件中追加內(nèi)容 | |
fs.copyFile(src, callback) | 復制文件 | |
fs.mkdir(path, callback) | 創(chuàng)建文件夾 | |
fs.readDir(path, callback) | 讀取文件夾列表 | |
fs.rmdir(path, callback) | 刪除文件夾 | 只能刪除空文件夾 |
fs.unlink(path, callback) | 刪除文件 | |
fs.readFile(path, callback) | 讀取文件內(nèi)容 | |
fs.writeFile(path, callback) | 寫出內(nèi)容到文件 |
- fs的回調(diào)函數(shù)一般第一個參數(shù)為錯誤對象
err
译蒂,err
有值說明出錯了曼月,err
為null說明比較順利。大概相當于這樣:
fs.readFile('./index.html', 'utf8', function (err, data) {
if (err) {
throw err;
}
// do something
console.log(data);
})
- 基本的用法大概就是這樣的柔昼,這里要注意的是
path
,為絕對路徑會比較好哑芹,因為node
命令是依賴控制臺的路徑的,所以當你去另一個目錄輸入相對路徑執(zhí)行時就會報錯捕透。 - 例如這樣:
E:> node index.js
是正常的聪姿,然而當你這樣D:> node E:
就會報錯找不到文件。
- path模塊的用法
-
path模塊的常用的方法
-
join(...agrs)
方法,很簡單用戶兩個地址間的拼接,你可能見過這樣的代碼
fs.readFile(path.join(__dirName,'../index.html'),(err, data) => { if(err) throw err; })
這里就是將相對路徑改成了絕對路徑乙嘀,這樣就不會出現(xiàn)因為控制臺地址的改變而讀取不到文件了末购。
- path還有很多方法,你可以只記住
path.parse(path)
這一個虎谢。用的時候打印看一下,然后取你想要的盟榴。用法如下:
返回的對象有以下屬性:
dir <string>
root <string>
base <string>
name <string>
ext <string>
例如在Windows系統(tǒng)上:
javascript path.parse('C:\\path\\dir\\file.txt'); // 返回: // { root: 'C:\\', // dir: 'C:\\path\\dir', // base: 'file.txt', // ext: '.txt', // name: 'file' }
在其他系統(tǒng)上
javascript path.parse('/home/user/dir/file.txt'); // 返回: // { root: '/', // dir: '/home/user/dir', // base: 'file.txt', // ext: '.txt', // name: 'file' }
-
-
很簡單的nodejs,但是要學的靈活貫通還是非常的難,nodejs中有很多npm包,我曾經(jīng)遇到一個人他每天堅持看10個npm包源碼,但是以這個速度都要看非常之久。貴在堅持婴噩。加油擎场!
下一個文章開始帶來一系列干貨。