• node項目的开发


    01 创建package.json文件: 

    1. npm init 创建一个package.json 项目描述的文件。
    2. package name : 包名
    3. version:版本
    4. description:项目描述
    5. entry point:入口文件 默认index.js
    6. tset command:测试命名
    7. git repository:对应github创库地址
    8. keywords:  关键字
    9. author:  作者
    10. license:"ISC"  开源协议

    02  关于package.json文件中:"test":"echo\'xxxxxx'\" && exit 1"

    1. 执行 npm run test 会执行"echo\'xxxxxx'\" && exit 1"  最后输入 xxxxxx   
    2. exit的作用是将执行的命令结束掉。

    03 开发依赖 生产依赖

    1. package.json文件中:
    2. // 这里面所有的命令都是开发依赖
    3. // 安装命令 npm install 包名 --save-dev 简写 npm i 包名 -D
    4. devDependencies:{viet webpack rollup等}
    5. // 生产依赖
    6. // npm i 包名
    7. dependencies:{vue vuex router md5 pinia}
    8. // 给编写插件或者编写npm包的开发人员使用的
    9. peerDependencies:{}

    04 npm 相关执行的命令

    1. npm config list
    2. 作用查看npm node版本 安装的目录地址等
    3. npm ls
    4. 查看全局可执行的文件
    5. npm get registry
    6. 查看镜像源
    7. npm config set registry http://taobao.xxxx
    8. 设置镜像源

    05 npm  install原理

    1. 执行 npm install 命令后:
    2. 第一步 会去找config 也就是 打开终端 执行的npm config list
    3. 第二步 会去找项目中的.npmrc的文件
    4. 第三步 如果项目中没有.npmrc的文件就会去用户级的.npmrc (存在于C盘中/用户)
    5. 第四步 如果用户没有npmrc就会去全局的查找(存在C盘/AppData
    6. 第五步 如果全局的没有机会去npm内置的.npmrc
    7. 第六步 然后再找项目中的package-lock.json文件
    8. 第七步 如果有上面的这个文件就会和webpack.json进行对比。如果不一致以webpak.json为主更新lock。
    9. 第八步 如果上面没有这个文件,就会获取包的信息 构建依赖树 进行下载

    06 npm run 原理

    1. 执行npm run xxx后
    2. 第一步 首先会去当前项目的目录下找node_modules/.bin/xxx文件 然后执行
    3. 第二步 如果当前目录中没有相关的文件 就会去全局的node_modules下面去找、 也就是我们安装的有些命令使
    4. 用的 npm i ts -g, 这个是把ts安装到了全局,并非当前的node_modeules。

    07 npm声明周期

    1. package.json文件中的命令
    2. "script":{
    3. "predev":"node reve.js",
    4. "dev":"node index.js",
    5. "postdev":"node post.js"
    6. }
    7. 声明周期函数 predev postdev
    8. 当执行npm run dev的时候 会先执行node reve.js 再执行 node index.js 最后执行npde post.js
    9. 使用的场景 比如执行打包的命令的时候 可以先把dist目录清除 , 在打包完成后 执行发布的命令

    08 npx  

    1. 第一种情况 npx节省磁盘的空间
    2. 正常项目情况下 当我们想要创建一个react项目的使用需要使用使用到脚手架
    3. 也就是create-react-app这时候我们会先安装脚手架,然后再用脚手架去创建项目,
    4. 造成的问题脚手架安装完成以后占用磁盘的空间。
    5. 当我们使用npx创建一个react项目的时候 不需要预先下载好脚手架 可以执行 npx create-react-app demo
    6. 去创建项目,并且没有给磁盘空间下载脚手架。
    7. npx执行的原理: 首先会现在当前项目node_modules/去找脚手架如果没有就去全局的node_modules去找,如
    8. 果全局的也没有,就是npmjs官网下载,下载完创建完项目再删掉。
    9. 第二种情况 如果我们想要执行vite这个命令的话
    10. 使用npm命令,不能直接执行npm vite, 需要在package.json中进行配置 dev:vite
    11. 使用npx命令,可以直接运行 npx vite, 因为会直接查找node_modules/.bin/目录下的vite去执行

    09 cjs与esm规范

    1. package.json 文件中:
    2. {
    3. type:"commonjs"
    4. }
    5. 语法 :
    6. require('fs') // 导入
    7. modulex.express = P 导出
    8. exporess
    9. {
    10. type:'module'
    11. }
    12. import xxx from './xx.js'
    13. export default = {}
    14. export const fn = ()=>{}
    15. 两者之间的区别:
    16. esm中的this是undefiend; cmj值是模块 {}
    17. cmj是同步的可以在逻辑中使用; esm是属于异步的不能在逻辑中编写
    18. iftrue){require('./index.js')} 这是可以的, import就不可以了
    19. 如果想要import在逻辑中使用的话 就需要使用函数式的方式导入了
    20. iftrue){
    21. import'./index.js').then(res=>{cosnole.log(res)})
    22. }

    10 全局的变量

    1. node环境中没有DOMBOM 没有window
    2. global定义全局变量 任何模块都可以获取
    3. global.name = 'index'
    4. globalThis定义全局变量在浏览器和node都可以使用

    11 filename与__dirname

    1. 如果我们在项目src/index.js文件中输入
    2. console.log(__dirname) // D/web/node/demo/src 到输出文件的目录
    3. console.log(__filename) // D/web/node/demo/src/index.js 到执行的文件了

    12 prcoess.cwd() 可以获取当前文件执行的目录 相当于__dirname

    13  process.exit() 杀死进程 :比如

    1. index.js文件中执行命令:
    2. setTimeout(()=>{
    3. console.log('这里不会输出了')
    4. },5000)
    5. setTimeout(()=>{
    6. process.exit() // 将进程杀死了
    7. },2000)
    8. process.on('exit',()=>{
    9. console.log('进程被杀死了执行的')
    10. })

    14 CSR前端渲染   SSR服务端渲染   SEO: 爬虫在找的时候只会找html页面的不会找js, 前端渲染html的内容较少,不利于seo,服务端已经把整个html页面渲染完毕了。SEO讲究TDK,
    T值得是title,D指的是标签的description描述。K: 关键字

    1. node环境中是无法创建和操作DOM因为不存在DOM
    2. 但是借助于jsDOM是可以的
    3. 第一步 安装 npm i jsdom
    4. 第二步 项目中使用
    5. const fs = require('fs')
    6. const {JSDOM} = require('jsdom')
    7. const root = new JSDOM(`
    8. `)
    9. // 请求一个接口 拿到数据填充到app里面 nodo18版本才能使用
    10. const window = root.window
    11. const document = window.document // 以上这两步主要用来操作DOM
    12. const app = document.queselector('#app')
    13. fetch('https://api.thecatapi.com/v1/images/search?
    14. limit=10&page=1').then(res=>res.json()).then(data=>{ // 第一个then指定返回的格式
    15. data.forEach(item=>{
    16. const img = document.createElement('img')
    17. img.src = item.url
    18. img.style.width = '200px'
    19. img.style.height = '200px'
    20. app.appendChild(img)
    21. })
    22. console.log(root.serialize()) // 这里需要将root转化为字符串 这里就是整个拼接好的DOM结构
    23. // 创建一个index.html的页面并把内容写入进入
    24. fs.writeFileSync('./index.html',root.serialize())
    25. })

    15 path相关的知识点

    1. import path = require('path')
    2. path.win32 可以指定电脑的系统
    3. path.basename 返回路径的最后一部分
    4. console.log(path.basename('./src/assets/index.html')) // index.html
    5. path.dirname // 返回的是路径
    6. console.log(path.dirname('./src/assets/index.html')) // ./src/assets/
    7. path.extname // 返回扩展名 如果有多个点 返回的是最后的一个
    8. console.log(path.extname(index.css)) // .css
    9. path.join // 拼接路径
    10. console.log('a','b') // a/b
    11. path.resolve // 拼接路径 只能有一个跟目录 如果有多个只返回最后一个
    12. path.parse() // 将路径解析成一个对象
    13. {root:"/',dir:"/home/user/dir'base: 'file.txt',ext:'.txt'name: 'file'}
    14. path.format() // 将对象转化为一个路径

    16 OS

    1. const os = require('os')
    2. console.log(os.platform()) // 获取操作系统 win32 darwin mac
    3. console.log(os.release()) // 系统的版本号 10.0.22632
    4. console.log(os.type()) // 也是获取操作系统
    5. console.log(os.version()) // 区分 家庭版 旗舰版等
    6. 做一个案例 webpack 有一个设置 open:true 会自动打开浏览器
    7. 底层实现的原理 判断不同的电脑的系统 分别调用不同的shell的命令 打开浏览器
    8. const {exec} = require('child_process') exec 可以执行shell命令
    9. const platform = os.platform()
    10. const open = (url) => {
    11. if(platform === 'win32'){
    12. exec(`start ${url}`)
    13. }else if(){ // 执行其他版本的命令}
    14. }
    15. open('https://www.baidu.com')
    16. 读取用户所在的目录 底层原理%suerprofile% mac是$HOME
    17. console.log(os.homedir())
    18. 获取CPU架构
    19. console.log(os.arch())
    20. 获取cpu的信息
    21. console.log(os.cpu().length)
    22. 获取网络信息
    23. console.log(os.networkInterfaces())

    17 procee控制进程

    1. process.platform
    2. console.log(process.platform) // win32 获取操作系统
    3. process.argv
    4. console.log(process.argv) // 获取执行命令 后面携带的参数
    5. 比如: node index.js --version 上面的命令就会输出
    6. ['F:\lNodejsllnode.exe','F:llprojectllnodelindex.js','--version']
    7. process.cwd()
    8. console.log(process.cwd()) // 和 __dirname 一样
    9. process.memoryUsage()
    10. console.log(process.memoryUsage()) // 获取内存的信息
    11. process.exit()
    12. console.log(process.exit()) // 退出进程
    13. process.kill(process.pid)杀死进程
    14. env获取操作系统所有的环境变量
    15. console.log(process.env) // 就是电脑系统中的环境变量
    16. 通过cross-env可以设置环境变量 npm i cross-env
    17. package.json文件中进行配置
    18. “scripts”:{"dev":"cross-env NODE_ENV=dev node index.js", "build":"cross-env
    19. NODE_ENV=pro node index.js"}
    20. 执行命令 npx cross-env NODE_ENV=production node index.js
    21. 获取环境变量 console.log(process.env.NODE_ENV)

    18 子进程 child_process

    1. const {exec,execSync,spawn,spawnSync,execFile,execFileSync,fork} = require('child_process')
    2. exec属于异步的方法 execSync属于同步的方法
    3. exec可以执行shell命令 和软件进行交互
    4. exec('node -v',(err,stdout,stderr)=>{
    5. if(err){
    6. return err
    7. }
    8. console.log(stdout.toString()) 得到的是buffer 需要转化为字符串
    9. })
    10. const nodev = execSync('node -v').toString() // 18
    11. execSync('start chrome https://www.baidu.com') // 打开chrom浏览器百度
    12. execSync('QQ音乐.exe的地址') // 打开QQ音乐
    13. ----------------------------------------------------------------------------------------
    14. spawn 没有字节上限的 因为返回的是个流 实时返回的 apawnSync用的比较少
    15. const {stdout} = spawn('netstat')
    16. stdout.on('data',(msg)=>{console.log(msg.toString())})
    17. stdout.on('close',(msg)=>{console.log('结束了')})
    18. ----------------------------------------------------------------------------------------
    19. execFile 可执行文件 执行脚本
    20. execFile(path.resolve(__dirname,'./bat.cmd'),null,(err,stdount)=>
    21. {console.log(stdout.toString())})
    22. ----------------------------------------------------------------------------------------
    23. fork 只能接收js模块 开启一个子进程 同时可以通信
    24. const testProcess = fork('./test.js')
    25. testProcess.send('我是父进程') // 父进程给子进程发消息
    26. testProcess.on('message',(msg)=>{console.log('接收子进程消息',msg)})
    27. test.js子进程的内容
    28. procee.on('message',(msg)=>{ // 子进程接收父进程消息
    29. console.log('接收到主进程的消息', msg)
    30. })
    31. process.send('我是子进程要发送给主进程的消息')
    32. 可以把耗时的任务放到子进程里面去执行

  • 相关阅读:
    dubbo+zookeeper配置及使用
    Windows静态库用C++代码调用C语言的旧库方法extern ”c“
    【Django】开发日报_3.2_Day:模板继承
    当下的力量(解读版)
    【LeetCode】最大连续 1 的个数
    【ROS】机械人开发二--ROS环境安装
    学习不同概率分布(二项分布、泊松分布等)概念及基础语法
    【解决方法】树莓派4B安装wiringpi失败、gpio -v与gpio readall命令not found(arm64架构)
    深度学习 opencv python 实现中国交通标志识别 计算机竞赛_1
    pgsql误删除pg_wal文件后,服务启动失败
  • 原文地址:https://blog.csdn.net/h960822/article/details/137795463