首页 > 编程语言 >nodeJS入门

nodeJS入门

时间:2022-10-21 21:38:15浏览次数:83  
标签:exports console log nodeJS 函数 module 模块 入门

目录

NodeJs 介绍

Node.js 就是运行在服务端的 JavaScript

它是基于Chrome V8 引擎的JavaScript 运行环境,简单理解就是一个可以让JavaScript脱离浏览器,执行的平台,并对JavaScript功能进行了增强(文件系统,模块,包,操作系统API,网络通讯,数据库操作等)

与JavaScript的区别:Node.js 是运行环境,JavaScript是一门编程语言

img

NodeJs 运行使用

  • 安装:下载地址
  • REPL模式:(Read-Evaluate-Print-Loop),即交互式命令行解析器,可以直接在命令行输入node,启动Node 的终端,直接编写NodeJs代码,适合用来测试和学习
    • 读取 - 读取用户输入,解析输入的 Javascript 数据结构并存储在内存中。
    • 执行 - 执行输入的数据结构
    • 打印 - 输出结果
    • 循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。

img

运行JS文件:node XXX.js

img

模块化

  • 目前有三种流行的模块化规范:分别是 AMD(异步加载 requirejs),CMD(seajs),Commonjs(同步加载,只适用于服务端 NodeJs平台)
  • NodeJs采用模块方式管理和组织代码,NodeJs所有的功能都存在每个模块中

模块组成

模块:一个具有特定功能的文件就是一个模块,模块之间相互独立,同时也可以相互共享数据,需要暴露数据和引入操作

/**
 * NodeJs模块组成:
 * 所有用户编写的代码都在模块中,模块就是文件(函数)
 * 该函数有五个参数:
 *    exports: 暴露对象,可以将模块中的数据暴露给引用模块
 *    require: 引入模块,用于在A模块中引入B模块,并将B模块暴露的数据赋值给变量
 *    module: 模块对象,包含了当前模块的所有信息
 *    __filename: 当前模块的文件名
 *    __dirname: 当前模块所在的路径
 */
 
// arguments 属性只能在函数内部使用,因此说明模块就是函数
console.log(arguments.callee.toString());  // 打印出函数体本身

exports.username = 'Echoyya'
// console.log(arguments);   // 可以将参数分别打印

require 函数

作用:在当前模块加载另一模块,不同类型的模块,引入模块时也有一些差异

模块分类:

1.自定义模块:开发者自己编写的功能文件即为自定义模块

  • 若子模块没有暴露数据时,返回空对象
  • 自定义模块必须加./,否则nodejs查找模块默认在node_modules目录中查找
  • 主模块:整个项目的启动模块,有且仅有一个,对其他模块进行整合调度
// hello.js
var obj = require('./test')
console.log(obj);   // {}

// test.js
console.log('Echoyya');

2.第三方模块:第三方程序员或公司开发的模块,先安装再使用,npm 安装,require 使用

3.系统模块:nodejs开发团队提供的功能模块 ,直接引入使用即可,无需安装

模块初始化:当一个模块被多次引入时,只执行一次,将暴露对象exports直接写入缓存,后续就直接读取缓存

img

exports 导出对象

作用:是当前模块的导出对象,用于导出模块公有方法和属性,其他模块通过require函数加载使用

exports.属性 = 值

exports.方法 = 函数

// test.js 暴露属性和方法
var username = 'Echoyya'

function showName(){
  console.log('test模块:showName方法被调用');
  console.log(module.exports === exports);   // true
}

exports.name  = username
exports.show  = showName


// hello.js  加载调用
var obj = require('./test')
obj.show()
  • exports对象 和 module.exports对象,指同一个内存空间, module.exports对象才是真正的暴露对象
  • exports对象 是 module.exports对象的引用,不能改变指向,只能添加属性和方法,若直接改变exports 的指向,则返回空对象
  • console.log(module.exports === exports); // true
  • 若想直接暴露对应的showName函数,可以改变module.exports的指向,module.exports=showName

img

module 模块对象

module.exports :暴露对象,exports对象只是对其的引用

// 常用语法:
module.exports.属性 = 值
module.exports.方法名 = 函数
module.exports = 对象或函数

以下内容作为了解即可:

  • module.id:模块ID,模块名称
  • module.parent:模块的父级
  • module.filename:模块的文件名和路径
  • module.children:子模块列表
  • module.paths:模块查找路径,默认查找当前目录下的node_modules,若没有则向上查找,直至根目录,如果另外配置了NODE_PATH环境变量,也会去查找

npm和package.json文件

npm

npm是什么?它(Node Package Manager)是基于Nodejs的包管理工具,能解决NodeJS代码部署上的很多问题

  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
  • 新版的nodejs已经集成了npm,可以通过输入 "npm -v" 来测试是否成功安装

package.json

以JSON格式描述nodejs项目的包描述文件,创建语法:npm init npm init -y(默认全部yes)

Nodejs 作用域

Nodejs中一个文件即是一个模块,由于nodejs在执行时会将用户编写的所有代码都封装在函数中,因此模块中用户使用var声明的变量或函数都是局部的只能在该模块中使用。

共享数据给其他模块使用的方法:

1.暴露对象:module.exports,文章上述有详细的描述

2.全局对象:nodejs中没有window对象,但是有global对象(尽量少用),可以把共享数据挂载到global对象上,以供其他模块使用,使用时global关键字可以省略

Nodejs 异步编程实现的三种方式

1. 回调函数

Node.js 异步编程的直接体现就是回调,Node 使用了大量的回调函数并且Node 所有 API 都支持回调函数。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。

回调函数:又称回调,将A函数的引用地址作为参数传递给B函数(调用者),B函数在执行过程中根据时机或条件决定是否调用A函数,A函数就是回调函数,一般作为函数的最后一个参数出现。

异步一定有回调函数,但是回调函数不一定是异步

// 异步一定有回调函数
 setTimeout(function () {
    console.log('1');
 }, 0);
 console.log(2)   // 输出结果  2 1

// 回调函数不一定是异步
 console.log(1);
 var arr = ['a','b','c']
 arr.forEach(function(v){
 	console.log(v);
 })
 console.log(3);  // 输出结果  1 a b c 3 即为同步

2. 事件

var http = require('http')
var server = http.createServer()

server.on('request',function(req, res){
  res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"})  // 设置编码
  res.write('<h1>访问nodejs服务</h1>')
  res.end()
})

server.listen(80,function(){
  console.log('服务器运行.....');
})

3. Promise 对象

promise是ES6中新增的对象,用于对异步的操作进行消息的传递,由于异步的返回结果时间顺序并不可控,使用promise就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。解决了以往的回调地狱现象。并提供统一的接口,使得控制异步操作更加容易。

promise有三种状态:pending(进行中)、resolved(已成功)和rejected(已失败),对象的状态不受外界影响。

Promise对象的状态改变,只有两种可能:从pending变为resolved和从pending变为rejected。一旦发生,状态就凝固不会再变。任何时候都可以得到这个结果。

Promise 提供的API远不止这些,还有许多强大的接口,更多具体用法,请参考阮老师的 [ECMAScript 6 入门]

var fs = require('fs')

function asyncReadFile(url){
  return new Promise(function(resolved, rejected){
    fs.readFile(url,function(err,data){
      if(err) {
        rejected(err)
      }else{
        resolved(data.toString())
      }
    })
  })
}

var p1 = asyncReadFile('./file1.txt')
var p2 = asyncReadFile('./file2.txt')

// 异步的返回结果时间顺序并不可控,p2可能会先执行完毕,
p1.then(function(value){
  console.log('p1',value);
},function(err){
  console.log(err);
})

p2.then(function(value){
  console.log('p2',value);
},function(err){
  console.log(err);
})

// Promise.all()用于将多个Promise实例,包装成一个新的Promise实例
// 数组格式传入多个Promise实例可以执行顺序 

//[p1,p2]
Promise.all([p1,p2]).then(function(datas){
  console.log('[p1,p2]',datas);
},function(errs){
  console.log(errs);
})

// [p2,p1]
Promise.all([p2,p1]).then(function(datas){
  console.log('[p2,p1]',datas);
},function(errs){
  console.log(errs);
})

img

参考文章

1.原文地址:https://www.cnblogs.com/echoyya/p/14450905.html#模块化

标签:exports,console,log,nodeJS,函数,module,模块,入门
From: https://www.cnblogs.com/hhddd-1024/p/16814809.html

相关文章

  • 09-JS函数入门总结
    JS函数简单入门知识点总结1.1函数的概念函数:为完成一个操作任务而组合在一起的的语句组,实现了程序的三大逻辑(顺序、分支和循环)1.2函数的作用减少重复的代码,方便......
  • 单片机入门第二课----点灯大师
    引言在上一博客中,我们正式开始了单片机的学习之路,讲了单片机的概念,以及我们使用的ESP32系列的单片机的IO引脚,讲了什么是GPIO,以及相关的总线通讯概念(UART,IIC,SPI),脉冲调制......
  • thinkphp 入门笔记
    1. 单数据查询   2.数据集的查询   3.  其他查询       ......
  • MasaFramework -- 缓存入门与设计
    概念什么是缓存,在项目中,为了提高数据的读取速度,我们会对不经常变更但访问频繁的数据做缓存处理,我们常用的缓存有:本地缓存内存缓存:IMemoryCache分布式缓存Redis:......
  • Python pygame新手入门基础教程
    pygame简介 pygame可以实现python游戏的一个基础包。  pygame实现窗口 初始化pygame,init()类似于java类的初始化方法,用于pygame初始化。pygame.init()......
  • MasaFramework -- 缓存入门与规则配置
    概念什么是缓存,在项目中,为了提高数据的读取速度,我们会对不经常变更但访问频繁的数据做缓存处理,我们常用的缓存有:本地缓存内存缓存:IMemoryCache分布式缓存Redis:......
  • 大厂进阶篇Docker与微服务实战-技术点从入门到高级全面覆盖
     说明随便创建个SpringBoot项目,写个Controller方法,然后用maven配置打包项目成xx.jar,调用接口如下面图片,当做案例进行测试。二、高级篇(大厂进阶)3.Docker微服务实......
  • Salesforce管理员入门,Org何时可以使用新的Release功能呢?
     在监控影响多个客户的问题时,了解你的Salesforce组织运行在哪个实例上会非常有用。当必须要找出存储数据和元数据的数据中心的位置时,这一点尤其重要。 本文将深入探......
  • NodeJS & Dapr Javascript SDK 官方使用指南
    Dapr是一个可移植的、事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的、无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和开发框......
  • HTML 快速入门 标签学习
    语法1,html文档后缀名.html或者.htm2,标签分为1,围堵标签:有开始标签和结束标签。如<html></html>2,自闭和标签:开始标签和结束标签在......