• Node.js基础


    Node.js

    基于Chrome的V8引擎的JavaScript 运行环境

    如何使用Node.js

    1.在官网下载Node.js https://nodejs.org/en/,然后在电脑中安装
    2.在终端中查看Node.js的版本

    node -v
    
    • 1

    3.新建一个js文件 ,例如:创建了一个myNode.js文件
    4.在终端运行

    // node js文件名字
    node myNode.js
    
    • 1
    • 2

    Nodejs中的模块

    模块化: 解决一个复杂问题,自顶向下逐层把系统划分为若干模块的过程,模块是可组合,分解和更换的单元。
    Node.js遵守了 CommonJS模块规范

    CommonJS 规定了模块特性和各模块之间如何相互依赖:

    1. 每个模块内部,module变量代表当前模块
    2. module变量是一个对象,它的exports属性(即module.exports) 是对外的接口
    3. 加载某个模块,其实是加载该模块的module.exports属性,require()方法用于加载模块

    模块化的优点

    1. 提高了代码复用性
    2. 提高了代码可维护性
    3. 可以实现按需加载

    模块作用域

    模块内定义的变量、方法等成员,只能在当前模块内被访问这种限制叫做模块作用域,避免了全局污染

    模块的分类

    1. 内置模块

    加载模块通过require(内置模块名字) 省略.js后缀名

    fs文件系统模块

    1.加载fs模块

    const fs = require('fs')
    
    • 1

    2.使用fs.readFile读取文件内容

    fs.readFile('./01.txt', 'utf8', function(err,data){
        // 失败结果
        console.log(err)
        // 成功结果
        console.log(data)
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.使用fs.writeFile写入内容到文件中,会覆盖文件写入前内容

    fs.writeFile('./01.txt','这是通过fs写入的文件内容','utf8', function(err){
        // 失败结果
        console.log(err)
    })
    
    • 1
    • 2
    • 3
    • 4
    path模块

    提供了一些工具函数,用于处理文件与目录的路径。

    fs.readFile('../01.txt', 'utf8', function(err,data){}
    • 1

    ./ 或以 …/ 开头为 相对路径,node命令会动态拼接当前相对路径 ,当我们在文件路径的上一层或其他目录运行时,拼接的路径就不正确。
    此时就需要使用绝对路径,在项目中不可能写死一个绝对路径,path模块就提供了解决该问题的相关办法。
    1.加载模块

    const path = require('path')
    
    • 1

    __dirname 表示当前文件所处的目录
    2.使用path.join可以把多个路径拼接在一起

    // 可在任何目录执行当前js,都能通过文件目录正确找到
    fs.readFile(path.join(__dirname,'./01.txt'), 'utf8', function(err,data){})
    
    • 1
    • 2

    注意:拼接../会抵消一个路径
    例如 :

    path.join('E:\\node\\my\\01.txt','../','./01.txt')
    //得到的路径是 E:\node\01.txt
    
    • 1
    • 2

    3.使用path.basename获取文件名

    const fpath = '/a/a/b/index.html'
    const fullname = path.basename(fpath)
    console.log(fullname) // index.html
    //只获取名字,不要后缀名
    const name = path.basename(fpath,'.html')
    console.log(name)  //index
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.使用path.extname获取文件名

    const lastpath = path.extname('/a/a/b/index.html')
    console.log(path.extname(lastpath)) // .html
    
    • 1
    • 2
    http模块

    1.导入http模块
    2.创建web服务器实例
    3.为服务器绑定request事件 监听客户端请求
    4.启动服务器

    //index.js
    //启动当前js文件 就可在浏览器通过http://127.0.0.1:80访问
    const http =  require('http')
    const server = http.createServer()
    server.on('request',(req,res)=>{
    	//访问一次就会打印一次
        console.log('有人访问')
    })
    server.listen(80,() => {
        console.log('开启服务 http://127.0.0.1:80')
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    回到调函数(req,res)=>{}中第一个参数req为请求对象,第二个res参数为请求响应对象
    可通过req.url获取请求地址,req.method获取请求方式
    在上面index.js中,访问http://127.0.0.1:80在node终端会打印,但浏览器中是一个空白页面。
    可以通过res.end()向页面返回指定的内容,如果内容包含中文需要设置res.setHeader('Content-Type','text/html; charset=utf-8',)防止乱码。

    //部分代码
    server.on('request',(req,res)=>{
        const str = `请求的客户端是 ${req.url},method是 ${req.method}`
        console.log(str)
        let content = '

    404 Not found

    '
    const url = req.url if(url === '/' || url === '/index.html') { content = '

    首页

    '
    }else if (url === '/about.html') { content = '

    关于页面

    '
    } res.setHeader('Content-Type','text/html; charset=utf-8',) res.end(content) }) //在index.js加入这些代码,访问服务器就会就会得到url在服务器返回的对应内容
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在index.js中 server.listen(80,() => {console.log('开启服务http://127.0.0.1:80')})80是端口号,127.0.0.1代表自己的电脑 对应localhost
    补充知识点:
    1.域名和IP是一一对应关系 存放在域名服务器
    2.端口号:一台电脑可以运行多个服务,每个服务对应唯一的端口号

    2. 自定义模块

    用户创建的每个.js文件都是自定义模块
    加载自定义模块使用require(路径加文件名)

    3. 第三方模块

    第三开发使用需要先下载

    npm install 第三方模块名称
    
    • 1

    加载第三方模块使用require(模块名)

    module

    module对象存储了和当前模块有关的信息

    module.exports 对象 默认为{}

    在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用
    当使用require()导入时得到的就是module.exports对象

    exports对象

    exportsmodule.exports 指向同一个对象
    永远以module.exports指向的对象为准

    模块加载机制

    1. 优先从缓存中加载,模块在第一次加载后会被缓存(意味着多次掉require()不会导致模块代码被多次执行)
    2. 内置模块的加载优先级最高
    自定模块加载机制

    ./ 或../路径标识符开头
    如果require自定义模块省略了文件扩展名,按照如下规则:

    1. 按照确切文件明进行加载
    2. 补全.js扩展名进行加载
    3. 不全.json扩展名进行加载
    4. 补全.node扩展名进行加载
    5. 加载失败,终端报错
    第三方模块加载机制

    没有开头会从当前模块的父目录开始,尝试从/node_modules文件夹中加载第三方模块,没有找到则移动到上一层父目录node_modules直到文件根目录

    目录作为模块(require(模块目录))
    1.找package.json文件 main属性 作为入口
    2.则试图加载index.js文件

    npm与包

    https://blog.csdn.net/qq_38367703/article/details/126838942?spm=1001.2014.3001.5501

    Express

    https://blog.csdn.net/qq_38367703/article/details/126856387?spm=1001.2014.3001.5501

  • 相关阅读:
    java实现幂等性校验
    vue+nodejs+express+jwt如何生成并处理token
    Vue 中使用事件总线来进行组件间通信($emit()、$on() 和 $off())
    mac m1关闭sip系统完整性保护csrutil disable,如何禁用mac m1的系统完整性保护
    职场生存----如何缓解尴尬
    在 Net7.0 环境下使用 RestSharp 发送 Http(FromBody和FromForm)请求
    Qt官方示例:Fridge Magnets Example(冰箱贴)
    【C++模块实现】| 【04】配置模块
    JAVA多线程基础篇--守护线程(Daemon Thread)
    Spring IoC容器简介说明(BeanFactory和ApplicationContext)
  • 原文地址:https://blog.csdn.net/qq_38367703/article/details/126832958