node.js 学习记录(持续更新中)

    科技2022-07-10  106

    记录从 2020.10.2 开始学习node的一些心得体会


    node.js 是什么

    JavaScript 的基本语法就是ECMAScript。

    平时我们一般写前端,所以此时JS是在浏览器上运行的。在浏览器的环境中,JS除了使用基本语法,还可以使用浏览器所提供的API (DOM和BOM)。

    与此相对应的,JS可以不依托于浏览器,而它可以在node环境中执行。在node环境中,JS除了使用基本语法,还可以使用node环境所提供的服务器级别的API(fs/http/path/os 等)。

    因此我们可得知,node并不是一种语言,而是一种JS的运行环境。JS在浏览器上运行,能使用DOM/BOM等API,但不能使用 fs/http/path/os 等API;同理,JS在node环境上运行,能使用 fs/http/path/os 等服务器级别的API,但不能使用DOM/BOM等API。

    简单实现接口

    var http = require('http') var server = http.createServer() server.on('request',function(request,response){ var arr = [ { name:'Lily', age:10 }, { name:'Bob', age:15 }, { name:'Zara', age:15 } ] response.end(JSON.stringify(arr)) }) server.listen(3000,function(){ console.log('server is opened'); })

    前端渲染后端渲染

    《简单学习前端渲染和后端渲染》点击这里跳转博客

    node.js的模块化

    node.js的模块化就是 文件作用域 + 通信规则(commonJS)

    common.js的语法是 require(执行模块中的代码和返回模块中exports导出的接口对象)+ exports

    exports和module.exports的区别

    其实node.js的模块默认导出的是module.exports对象,它底层有默认的代码是 var exports = module.exports 把后者的引用传给了exports变量,即此时 exports === module.exports ,所以平时我们用 exports 来导出数据其实相当于是一种简写的方式。

    所以我们如果要导出单个数据,需要通过例如 module.exports = ‘abcd’ 的方式,而非 exports = ‘abcd’,因为模块最终导出的是module.exports 而非 exports 这个变量,给 exports 赋新值相当于改变了它的引用而不是改变了 module.exports 。

    模块查找机制

    当require一个模块时,其查找顺序如下:

    优先从缓存加载(比如,在一次执行中重复 require('./b.js'),b.js中的代码不会重复执行,但可以拿到接口对象)核心模块(内置)路径形式的文件模块(./ 表示当前目录,../ 表示上一级目录,/ 表示当前文件模块所属磁盘根路径,几乎不用)第三方模块(通过 npm 下载,require(‘包名’),有特定的查找规则)

    npm install 自动安装依赖包的原理

    当我们第一次开发某个项目的时候,所依赖的包需要自己去 install ,接着这些依赖会被记录到 package.json 中。

    当后面打包并上传项目时,不需要再连同 node_modules 一起打包(体积太大)。

    当再次拿到项目时,我们可以直接通过 npm install 一键安装所有依赖,因为项目中的 package.json(它就相当于一张说明书)已经记录了所有依赖的包。

    cnpm 和 npm

    npm是国外的网站,所以下载东西时会比较慢。

    我们可以通过npm下载cnpm,通过cnpm(淘宝镜像)下载东西就会快很多了。

    cnpm会尽量更新到与npm同步。

    vue-cli 和 npm init

    用 vue-cli 创建vue项目时,个人猜测底层有用到 npm init 这句命令初始化npm来管理依赖。

    简单用express实现接口

    先要用 npm install express --save 安装好模块。

    var express = require('express') var app = express() app.get('/',function(req,res){ res.send('hello express!') }) app.listen(3000,function(){ console.log('app is running...'); })

    设置自动重启

    (如有问题详情百度)

    先要用 npm install --global nodemon 安装好插件。

    后面运行时,用 nodemon 替代 node ,如 nodemon test.js 。

    这样就不需要每次修改后,都手动中断服务再重启了。

    设置静态资源

    (实测可行)

    使用 use 来设置可访问静态资源,如下:

    可通过 localhost:3000/content/XXX 来访问服务器 /public/ 文件夹下的一些静态资源。

    var express = require('express') var app = express() app.listen(3000,function(){ console.log('running...'); }) app.use('/content/',express.static('./public/'))

    在express中使用art-template

    详情看 art-template 官方文档

    在node.js中获取请求参数

    此处使用express框架

    app.get('/',function(req,res){ res.send('hello express!') })

    如果是 get 请求,可以直接用 req.query 获取参数;

    如果是 post 请求,需要安装第三方插件 body-parser 。通过这个中间件,我们可以使用 req.body 获取参数。

    package.json和package-lock.json的区别

    package.json会记录项目需要用到的直接依赖。

    新版本的 npm 在 install 后会多出一个 package-lock.json 。package-lock.json会记录所有相关的依赖,因此当重新 npm install 的时候,安装速度会更快,而且它可以锁定版本,因为package.json只能限定某个包安装的版本范围,而有package-lock.json文件的话就可以制定安装具体版本。

    举个例子:

    package.json 如果记录了 express 包的版本为1.1.1,那这里的1.1.1只是一个大概的版本范围,并不是最终具体安装版本。

    而 package-lock.json 会记录express及其相关依赖(项目直接依赖express包,但express本身也会依赖其他包),并会指明具体安装的包版本。比如express可能实际安装了版本1.2.1,虽然 package.json 记录了 express 包的版本为1.1.1,但 package-lock.json 文件中记录express的版本是1.2.1。

    因为有了 package-lock.json ,所以可以安全地锁定版本,并且在重新 npm i 的时候,因为不需要再去重新查找相关依赖,所以会比没有 package-lock.json 的时候安装得更快。

    Processed: 0.015, SQL: 8