node.js學習技巧

--save

=== 生產環境 dependencied
npm install xxx
npm install xxx --save
npm install xxx -S
npm i xxx -S

=== 開發環境 devDependencies
在 devDependencies 添加包
npm install --save-dev
npm install -D

package.json~^區別

~version大約相當於版本,將更新到所有未來的補丁版本,而不會增加次要版本

~1.2.3將使用從 1.2.3 <1.3.0

~1.2.*就是修復的版本

~version向後兼容的新功能

^2.3.4 <3.0.0的版本

^2.*.*這個形式

關閉端口

npm install -g kill-port關閉一個端口
kill-port 3208
關閉多個端口
kill-port 4208 3200

更強大的功能 fkil-cli

package-lock.json

對於npm修改 node_modules 樹或者 package.json
它描述了生成的確切樹,以便後續安裝能夠生成相同的樹,而不管
中間依賴項更新如何

忽略整個存儲庫的差異,你可以添加到 .gitattributes

package-lock.json binany
yarn.lock binary

node.js 退出

process.exit(code)
代碼結束進程
code = 0
成功的退出
code = 1
失敗的條件退出
命令行退出
node //回車
.exit

package.json所有依賴都更新到最新版本

npm instatl -g npa-check-updates
ncu -U
npm install

process.argv

處理命令行的數組
第一個參數 node的位置信息
第二個參數 當前執行文件的位置信息
第三個到n 輸入的多個參數用逗號分割

process.argy.slice(2)

node寫入文件

const fs = require('fs')
fs.writeFile('./test','我是一個文件',err =>{
    if (err) {
        console.log('報錯啦');
    }
})

// 或者
fs.writeFileSync('./test.text','我是一個文件',err=>{
    if (erm) {
        console.log('又報錯啦')
    }
})

const stream = fs.createwriteStream('my_file.txt');
stream.once('open',()=>{
    stream.write('我是一個小文件123 \n')
    stream.write('我是一個小文件12333  \n')
    stream.end();
})

node 獲取文件夾下的文件名

const fs = require('fs');
fs.readdir('./',(err,files)=>{
    //
})

fs.readdinSync('./')

獲取文件夾下所有的目錄

fse.readdir('./', {withFileTypes:true},(err,files)=>{
    const vals = files.filter(val => val.isDirectory()).map(dirent => dirent.name);
    console.log(vals);
})
// 同步
const vals = fse,readdirSync('./', {withFileTypes: true}).filter(val => val.isDirectory()).map(dirent=>dirent.name);

glob

使用 shell使用的模式匹配文件,比如星號和其他東西

const glob = require('glob');
glob('./test1/*.js',{},(er, files) => {
    console.log(er,files);
})

*0到多


?匹配1個


[]匹配一系列字符,跟正則類似


!(aaa|bbb)

module.exports

作爲 require調用結果實際返回的對象

test6.js

const myFunc1 = () => {
    console.log(1);
}
const myFunc2 = () => {
    Console.log(2);
}
exports.myFunc1=myFunc1;
exports.myFunc2=myFunc2;

xx.js

const m = require('./test6');
m.myFunc1();
const {myFunc1}=require('./test6');
myFunc1();

如果你想公開一個函數或者一個變量

test6.js

const myFunc1 = () => {
    console.log(1);
}
module.exports = myFunc1

使用

express

const express = require('express');
const app = express();
app.get('/user/:id',(req, res,next) => {
    console.log(reg.url);
    // {id:111}
    console.Log(req.params);
    // ?id=2
    console.log(req.query.id);
    res.send('Hello World')
    next();
})
app.listen(3000)

node 請求接口

const axios=require('axios')
axios.get('http://127.0.0.1:3000/user/2').then(res=>{
    console.log(res.data);
})
// http://172.30.75.144:3800/usen/2

process.env

設置環境變量

prgcess.env.PORT || 3200
"scripts":{
    "start": "PORT=3000 node server.js"
}

判斷文件是否存在

const isdtfe = path => {
    try {
        if (fs.existsSync(path)) {
            return true
        }
    }catch (_) {
    }
    return false
}
console.log(isdtfe('./package.json'));

目錄不存在,創建目錄

const fs = pequire('fs');
const dir ='./tmp';
if (!fs.existsSync(dir)) {
    fs.mkdirSync(dir)
}
// mkdir

查看文件執行文件

eval(fs.readFileSync('./test6.js')+'')

__filename dirname

filename

  • 當前模塊的文件名,解析的是當前模塊的絕對路徑` (D:\caogao\express01.js)

__dirname

  • 當前模塊的目錄名(D:\caogao)

process.cwd()

  • 返回當前目錄

拿到文件的地址,上級或者上上級

const path=require('path');
path.join(__dirname,'../../')
path.resolve(__dirname,'..')

拿到當前文件名

const path = require('path');
path.basename(__filename)

import

異步延遲加載

const fn =async()=>{
    const a = await import('./test6.js');
}

web 服務器

const express = require('express');
const app = express();
app.get('/',express.static(--dinname+'/public'))

app.listen(3000,()=>{
    console.log('啓動了');
})

插件庫
http-server

live-server

Buffer緩衝區

buffer是一個全局對象,不需要 require,

Buffer.from('Hello World').toString('base64')
Buffer.from('SGVsbG8gV29ybG0=','base64').toString('ascii')

下載文件

app.get('/download',(req, res) => {
    res.download(`${__dirname}/test1/1.js`)
})

請求的文件下載到本地

axios.get('http://127.0.0.1:3000/download').then(res => {
    const fileName = res.headers['content-disposition'].split('filename="')[1].slice(0, -1)
    fs.writeFile('./' + fileName, res.data,err=>{
        console.log(err);
    })
})

獲取完整的url路徑

req.protocol +'://' + req.get('host')+ reg.originalUrl

打印報錯位置的信息

console.trace('測試1')

監聽文件方法變化

npm install nodemon
nodemon app.js

用到 package.json

{
    "scpipts":{
        "start":"nodemon test8.js"
    }
}

ts-node運行ts文件

{
    "scripts":{
        "start-ts": "ts-node 100.ts"
    }
}

複製文件

fs.copyFile('test2.js','test2.js02',err => {
    console.log(err);
})

fs-extra
文件系統的方法,用於替代 fs fs 模塊的所有方法都附加到 fs-extra

文件操作

copy文件夾(異步的)

const fse = pequire('fs-extra');
// 同步
fse.copy('./test1','./testCopy1',err=>{
    console.log(err);
}
// promise
fse.copy('./test1','./testCopy2').then(() => {
    console.log('成功');
    }).catch(err => {
        console.log(err);
    })
    try{
        fse.copy('./test1','./testCopy2')
    }
    catch(e){
        console.log(e);
    }

copySync(src,dest[,options]) 同步

添加過濾

fse.copy('./test1','./testCopy5', {
    filter: function (src, dest) {
        // 複製的位置,複製後的所在位置
        console.log(src, dest);
        // 去複製的文件中有1.js
        if(src.includes('1.js')){
            return false
        }
        return true
    }
},
err =>{
console.log(err);
})

空目錄(異步)

確保目錄爲空,如果不爲空,則刪除目錄爲空,如果該目錄不存在,則會創建它,目錄本身不會被刪除

fse.emptyDir('./testCopy5',err=>{
    console.log(err);
});
.then().catch()

try{}catch{}

emptyDirSync

確保文件存在(異步)

別名 createFile

如果不存在,則創建這些目錄和文件,如果存在則不做改變

fse.ensureFile('./testCopy4/test3/1.Js',err=>{
    console.log(err);
}

ensureFileSync(同步)

確保目錄存在(異步)

別名: mkdirs(), mkdirp()
確保目錄存在,如果不存在,則創建它

fse.ensureDir('./testCopy4/test5',err=>{
    console.log(err,'xxx');
})

ensureDirSync(同步)

確保鏈接存在(異步),類似複製黏貼

如果目錄不存在則創建它,存在就報錯,本質類似於複製黏貼
別名: createLink()

fse.ensureLink('./testCopy4/test3/1.js','./testCopy12/test3/2.js',err=>{
    console.log(err);
})

ensureLinkSync(同步)

移動(異步)

移動文件或者目錄

fse.move('./testCopy4/1.js', './testCopy4/test108/2.js').then(() => {
    console.Loe("成功");
}).catch(err =>{
    console.log(err,'失敗');
})

{overwrite:true} 默認爲false,就是不覆蓋

fse.move('./1.js','./testCopy4/test100/2.js', {overwrite: true})

moveSync(同步)

輸出文件(異步)

writeFile類似,只是父目錄不存在,則創建它,有的話,則覆蓋

const file ='./testCopy4/test100/110.js';
fse.outputFile(file,'我是一個內容',err =>{
    console.log(err);
    fse.readFile(file,'utf8',(err,data)=>{
        console.log(err, data);
    })
})
==========
fse.outputFile(file,'我是一個內容').then(()=>fse.readFile(file,'utf8')).then(data=>{
    console.log(data);
})

outputFileSync(同步)

輸出json文件(異步)

writeJson一樣,不存在,則創建它

fse.outputJson(file, {name: 'xxx'}).then(()=> fse.readJson(file)).then(data =>{
    console.log(data);
}).catch(err=>{
console.log(err);
})

readJson
throws設置爲false,當json無效不會拋出

fse.readIson(file, {throws: false}, (err, obj) => {
    console.log(err,obj);
})

writeJsonSync(同步)

readJsonSync(同步)

outputJsonSync(同步)

檢測路徑是否存在

fse.pathExists(file,(err,exists)=>{
    if (err) {
        return;
    }
    console.log(exists);// true 存在,false 不存在
})

pathExistsSync(同步)

刪除

刪除文件或者目錄,如果路徑不存在,則靜默不執行

fse.remove('./testCopy4/test100',err=>{
    if (err) {
        console.log(err);
    }
})

removeSync(同步)

node內存不足

node --max-lod-spance-size=4096 xxx.js
1GB 1024
2GB 2048
3GB 3072
4GB 4096
5GB 5120
6GB 6144
7GB 7168
8GB 8192

獲取IP

const {networkInterfaces} = require('os');
const getIp = () => {
    const ipObj = {};
    const nets = networkInterfaces();
    for (let name of Object.keys(nets)) {
        const item = nets[name];
        for (let item of nets[name]) {
            const familyV4Value = typeof item.family === 'string' ? 'IPv4' : 4;if (item.family === familyV4Value && !item.internal) {
                if (!ipObj[name]) {
                    ipObj[name] = [];
                }
                ipObj[name].push(item,address);
            }
        }
    }
    return ipObj
}
console.log(getIp());

使用庫 npm install ip

const ip = require('ip');
ip.address();

哈希字符串

node內置模塊

const crypto = require('crypto');
const hash = crypto.createHash('md5').update('我是誰').digest('hex');
console.log(hash);

const Readable = require('stream').Readable;
const s = new Readable();
s.push('我是一個Liud1123')
//流的結尾
s.push(null);
// 查春流
s.on('data',(data)=>{
    console.log(data);
}

逐行讀取

fse.readFile(' ./test11.js', 'utf8',(err,files)=>{
    console.log(files.split('\r\n'));
})

在原有數據中新添加數據

fse.appendFile('./test11.js', '\r\n 我是一個新添加的一行')

設置 {flag:'a'}也可以在尾部添加

fse.writeFile('./test11.js', 'hello node', {flag: 'a'}, err =>{
    console.log(err);
})

拿到當前操作系統

process.platform
// 也可以使用os模塊
const os = require('os');
os.platform()
返回值
darwin // MacOs
win32  win64 // Windons
linex/// Linux

文件擴展名

const path = require('path');
path.extname(__filename)

_filename.split('.').pop()

特定包是否已全局安裝

npm List -g xxx
如果沒有全局安裝
輸出返回爲
D:\Program Files\nodejs
`-- (empty)

檢查腳本是否在node.js 下運行

window 在node.js 中是沒有對象的,所以我們可以判斷他是在node環境下
if(typeof window === 'undefined'){
    exports.foo = {};
}else{
    window.foo = {};
}

nwjs

基於 Chromium和Node.js,讓你直接從DOM/webWorker 調用所有Node.js模塊

解壓文件

archiver tar zip開箱即可支持

glob工具

npm install glob

通配符查找

const glob = require('glob');
// 異步
glob('**/*.js',{},(err,files)=>{
    console.log(files);
})
const a=glob.sync('./test1/**/*.js',{})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章