安装

http://nodejs.cn/download/

检查
node -v
npm -v
出现版本号则说明安装成功

npm

NPM(node package manager)是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题.

Npm作用和使用场景:

  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

npm命令

npm init 初始化项目 (会有一系列的对话)
package name: (project) // 当前的包名是什么,(括号里面的是默认值);包名不要和现有的框架重名
version: (1.0.0) // 版本
description: // 描述
entry point: (index.js) // 项目的入口文件
test command: //测试命令
git repository: //git 仓库地址
keywords: // 项目的关键词
author: //作者
license: (ISC) //协议
package.json //是我们项目的描述文件 :入口文件,项目依赖,项目启动命令

安装依赖

npm install 模块名称
npm i 模块名称 // 简写
安装完成之后,会在package.json文件中加入如下字段

  1. "dependencies": {
  2. "jquery": "^3.6.0"
  3. }

当前项目用到那里包(依赖)

安装方式:

  • 本地安装:用来安装依赖 (项目用到哪些包就用本地安装的方式)
  • 全局安装:一般用来安装工具类, 如:cnpm , pm2 vue-cli

全局安装方式:

  1. npm i -g 模块名称

使用淘宝 NPM 镜像

大家都知道国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。
淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。
设置:npm config set registry https://registry.npm.taobao.org
查看: npm config get registry
还原:npm config set registry https://registry.npmjs.org/
Ps:也可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:
npm install -g cnpm

## 查看已安装

  1. npm ls // 查看当前项目的安装
  2. npm ls -g //查看全局的安装

开发环境的依赖

  1. "devDependencies": {
  2. "bootstrap": "^5.1.1"
  3. }

项目复活

已经开发好的项目,如果需要拷贝,那么是不需要拷贝node_modules文件夹的,重新安装即可

  1. npm i

会自己找package.json文件里面描述的依赖

版本号

使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码
Semantic-Versioning 语义化版本控制分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。
如果只是修复bug,需要更新Z位。
如果是新增了功能,但是向下兼容,需要更新Y位。
如果有大变动,向下不兼容,需要更新X位。
版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如”argv”: “0.0.x”表示依赖于0.0.x系列的最新版argv。
一个标准的版本号必须是X.Y.Z的形式,X是主版本,Y是副版本,Z是补丁版本。.
X: 代表发生了不兼容的API改变
Y: 代表向后兼容的功能性变化
Z: 代表向后兼容bug fixes
语义化版本号规则
X.Y.Z - A.B.C 连字符范围
1.2.3 - 2.3.4 等价于 >=1.2.3 <=2.3.4 1.2.3 - 2 等价于 >=1.2.3 <3.0.0
~1.2.3 波浪线范围
~1.2.3 等价于 >=1.2.3 <1.(2+1).0 等价于="">=1.2.3 <1.3.0 ~1.2 等价于 >=1.2.0 <1.(2+1).0 等价于="">=1.2.0 <1.3.0 (Same as 1.2.x) ~1 等价于 >=1.0.0 <(1+1).0.0 等价于 >=1.0.0 <2.0.0 (Same as 1.x)

模块

导出

  1. function add(a,b){
  2. return a+b
  3. }
  4. var a = 10;
  5. module.exports = {
  6. add:add,
  7. a:a
  8. }

导入

  1. var tool = require('./tool')

全局变量

dirname // 获取当前文件所在的路径
filename ////当前执行文件所在的路径
require()
Console
module
exports
setInterval setTimeout

path

路径的操作的内置库
后续项目中需要用到路径的都用这个库去操作

  1. path.dirname('src') //返回src的父级路径
  2. path.basename('src') //当前文件夹
  3. path.join() //路径拼接 后面要用到路径凭借的都用这个方法去操作

fs 文件系统

stat

  1. var fs = require('fs');
  2. // 查看文件信息
  3. // 参数1:需要读取的文件的路径 ,
  4. // 读取成功或者失败后的回调
  5. // 回调函数里面有两个参数
  6. // 参数1:错误
  7. // 参数2: 读取到的信息
  8. fs.stat('./test.txt',function(err,info){
  9. console.log(err)
  10. //路径错误
  11. /*
  12. [Error: ENOENT: no such file or directory, stat './test.txt1'] {
  13. errno: -2,
  14. code: 'ENOENT',
  15. syscall: 'stat',
  16. path: './test.txt1'
  17. }
  18. */
  19. console.log(info)
  20. // 获取到文件信息
  21. /*
  22. {
  23. dev: 16777221,
  24. mode: 33188,
  25. nlink: 1,
  26. uid: 501,
  27. gid: 20,
  28. rdev: 0,
  29. blksize: 4096,
  30. ino: 55428847,
  31. size: 8,
  32. blocks: 8,
  33. atimeMs: 1631504207835.8264,
  34. mtimeMs: 1631504206388.4182,
  35. ctimeMs: 1631504206388.4182,
  36. birthtimeMs: 1631504206388.1956,
  37. atime: 2021-09-13T03:36:47.836Z,
  38. mtime: 2021-09-13T03:36:46.388Z,
  39. ctime: 2021-09-13T03:36:46.388Z,
  40. birthtime: 2021-09-13T03:36:46.388Z
  41. }
  42. */
  43. })

readFile

读取文件内容

  1. var fs = require('fs');
  2. /*
  3. 读取文件的内容
  4. 参数1:文件的路径
  5. 参数2:内容的解析编码
  6. 参数3:回调函数
  7. */
  8. fs.readFile('./test.txt','utf8',function(err,info){
  9. console.log(err)
  10. console.log(info)
  11. })
  12. /*
  13. 如果不传 解析编码 读取到内容是一个buffer对象
  14. 可以用toString()方法来解析
  15. */
  16. fs.readFile('./test.txt1',function(err,info){
  17. console.log(err)
  18. console.log(info.toString())
  19. })

writeFile

  1. var fs = require('fs');
  2. /*
  3. 参数1:需要写入的文件, 没有就会创建
  4. 参数2:需要写入的内容 ,会覆盖原来的内容
  5. 参数3:回调
  6. */
  7. // fs.writeFile('./test.txt','我是写入的内容',function(err){
  8. // console.log('写入成功')
  9. // })
  10. // 向文件末尾追加
  11. // fs.writeFile('./test.txt','222',{flag:'a+'},function(err){
  12. // console.log('写入成功')
  13. // })
  14. // 在开头加,但是也会被覆盖
  15. // fs.writeFile('./test.txt','111',{flag:'w+'},function(err){
  16. // console.log('写入成功')
  17. // })
  18. // 向文件末尾追加
  19. // 参数1: 追加的文件
  20. // 参数2: 追加的内容
  21. // 参数3: 回调
  22. fs.appendFile('./test.txt','bbbb',function(err){
  23. console.log('ok')
  24. })

unlink

  1. //删除文件
  2. // 参数1: 需要删除文件的路径 , 如果找不到也不会报错的
  3. fs.unlink('./text.txt',function(err){
  4. console.log('del ok')
  5. })

复制文件

  1. var fs = require('fs');
  2. // 创建读的流
  3. var reader = fs.createReadStream('./test.txt');
  4. // 创建写的流
  5. var writer = fs.createWriteStream('./2.txt');
  6. // 读到的流通过pipe方法写出去
  7. reader.pipe(writer)
  8. //这种复制方法复制大文件

加密

md5加密方式

MD5特点
•不可逆;
•不管加密的内容多长,最后输出的结果长度都是相等的;
•内容不同输出的结果完全不同,内容相同输出的结果完全相同。

  1. var crypto = require('crypto');
  2. //1 .创建md5加密对象
  3. var md5 = crypto.createHash('md5');
  4. // 2.加密字符串,会返回一个加密后的对象
  5. var md5sum = md5.update('young1024')
  6. // console.log(md5sum)
  7. //3. 返回16进制加密后的字符串
  8. var result = md5sum.digest('hex');
  9. console.log(result)
  10. // d993de3659f48c800f636e9805fa1ffb
  11. // var result2 = md5sum.digest('hex');
  12. // 重复调用digest会报错: Digest already called
  13. var r2 = crypto.createHash('md5').update('123456').digest('hex')
  14. console.log(r2)

sha256加密方式

  1. var crypto = require('crypto');
  2. /*
  3. crypto.createHmac()
  4. 参数1:sha256 是已知的加密方式
  5. 参数2:秘钥哦
  6. update()
  7. 你需要加密的内容传在里面
  8. digest('hex')
  9. 返回16进制加密后的字符串
  10. */
  11. var secret = crypto.createHmac('sha256','young1024').update('123456').digest('hex')
  12. console.log(secret)
  13. var secret2 = crypto.createHmac('sha256','young1024').update('654321').digest('hex')
  14. console.log(secret2)