初学Nodejs(1):简介+ 模块化

news/2024/4/30 15:28:59/文章来源:https://blog.csdn.net/lalala_dxf/article/details/125655446

文章目录

  • 初学Nodejs
    • 1、概述
    • 2、nodejs解决的问题
    • 3、安装nodejs
      • windows上安装和使用node
    • 4、IDE的使用选择
    • 5、node模块化
      • 5.1 介绍
      • 5.2 模块分类
      • 5.3 CommonJS模块化介绍

初学Nodejs

1、概述

  • Node.js是一个能够在服务器端运行javascript开放源代码、跨平台javascript运行环境
  • Node采用google开发的v8引擎运行js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模
  • Node大部分基本模块都用javascript编写。在Node出现之前,js通常作为客户端设计语言使用,以js写出的程序常在用户的浏览器上运行。

2、nodejs解决的问题

问题的根源:web服务器的高并发性能问题。传统的服务器都是多线程的,每次进来一个请求,就会创建一个线程去处理请求,这样对服务器的硬件要求会比较高,与硬盘读写速度有关。

解决:开发出Node.js,借用google开发的v8引擎,在服务器上编写javascript语言,nodejs是单线程,由此对服务器硬件要求比多线程服务器要低。

单线程既是nodejs的优点,同时也是缺点,但这个缺点可以通过在后台设置一个I/O线程池解决,也就是说可以创建多个nodejs的服务器。

  • Node历史
    在这里插入图片描述
  • node能用来做什么
    (1)web服务API,如REST
    (2)实时多人游戏
    (3)后端的web服务,如跨域、服务器端的请求
    (4)基于web的应用
    (5)多客户端的通信,如即时通信

(1)基于Express框架(http://www.expressjs.com.cn/),可以快速构建web应用
(2)Electron框架(http://eletronjs.org/),可以构建跨平台的桌面应用
(3)基于restify框架(http://restify.com.),可以快速构建API接口项目
(4)读写和操作数据库、创建实用的命令行工具辅助前端开发

java写的后台服务器可以很好的处理请求,而nodjs写的后台服务器可以比java写的服务器更快速的渲染页面,所以通常可以结合一起使用。

3、安装nodejs

windows上安装和使用node

windows安装node

4、IDE的使用选择

vscode,hbuilder,webstorm都可

5、node模块化

ECMAScript标准的缺陷
(1)没有模块系统
(2)标准库少
(3)没有标准接口
(4)缺乏管理系统

5.1 介绍

如果程序设计的规模达到了一定程度,则必须对其进行模块化,模块化可以有多种形式,但至少应该提供能够将代码分割为多个源文件的机制。
js中常用模块化:
(1)CommonJS
(2)ES6模块化
(3)AMD
(4)CMD

5.2 模块分类

  • 核心模块(内置模块)
    • node引擎提供的模块,有fs,path,http等,例如fs文件引入模块,使用require引入时不是通过路径引入,而是直接名字引入,例如var fs = require('fs');
  • 第三方模块
    • express,mysql等
  • 文件模块
    • 用户自己创建的模块,使用路径引入(绝对路径和相对路径都可以)

5.3 CommonJS模块化介绍

Node内部提供一个Module构建函数。所有模块都是Module的实例。每个模块内部,都有一个module对象,代表当前模块。

CommonJS使用require('url')引入模块化文件;
使用exports.xxx单个内容暴露或者module.exports={暴露的内容}整体暴露模块文件内容

例如:

  • 一个独立的模块化文件hello.js
    如果不使用exports暴露时
console.log('hello')// 一个模块化js文件中的内容是被一个函数包裹起来的,也就是说通过let,const定义的变量都是局部变量
/** 因为是局部变量,所以外部不能访问到,这样也是为了避免污染全局空间*/let x = 1;
let y = 2; // 而var由于有变量声明提升,所以得分两种情况,变量声明前是否是有var进行声明,有,则是局部变量,无,则为全局变量
// a = 3; // 全局
// var b = 4; // 位于函数对象内,所有是局部变量
  • 在main.js中引入CommonJS模块化文件
const md = require('./hello.js')console.log(md); // {} // 返回一个对象,返回的是引入的模块
// console.log(x); // 报错,因为没有被x,y都没有被暴露
// console.log(y); // 报错console.log(md.x); // undefined 因为对象中没有x,y变量,所以是undefined
console.log(md.y); // undefined

可以看到如果js文件没有主动暴露内容就看到访问不到hello.js中的变量,接下来通过exports暴露内容

  • hello.js
console.log('hello');// 向外暴露变量或方法
exports.x = 1;
exports.y = 2;
exports.fn = function(){console.log('这是一个方法');
}
  • main.js
const md = require('./hello.js')console.log(md); // {} // 返回一个对象,返回的是引入的模块
// md的结果
/*
hello
{ x: 1, y: 2, fn: [Function (anonymous)] }
*/console.log(md.x); // 1
console.log(md.y); // 2
console.log(md.fn); // [Function (anonymous)]
// 调用引入的函数
md.fn()

经过exports暴露之后,可以发现可以访问hello.js中的变量了。

全局对象global

在node中有一个全局对象global,他的作用和网页中的window类似,在全局中创建的变量都会作为global的属性保存,在全局中创建的函数都会作为global的方法保存

(1)证明模块化js文件中的变量不是全局变量

  • hello.js
var a = 10; 
console.log(global.a); // undefined
// 说明global身上没有a变量(属性),进而说明a不是全局变量 
  • main.js
const md = require('./hello.js')
console.log(md);

(2)证明模块化js文件中的代码是在函数内部执行的

  • hello.js
var a = 10;
console.log(arguments); // 输出当前类数组对象
/*
[Arguments] {'0': {},   '1': [Function: require] {resolve: [Function: resolve] { paths: [Function: paths] },main: Module {id: '.',path: 'c:\\Users\\dxf\\Desktop\\NODEJS',exports: {},filename: 'c:\\Users\\dxf\\Desktop\\NODEJS\\hello.js',loaded: false,children: [],paths: [Array]},extensions: [Object: null prototype] {'.js': [Function (anonymous)],'.json': [Function (anonymous)],'.node': [Function (anonymous)]},cache: [Object: null prototype] {'c:\\Users\\dxf\\Desktop\\NODEJS\\hello.js': [Module]}   },   '2': Module {id: '.',path: 'c:\\Users\\dxf\\Desktop\\NODEJS',exports: {},filename: 'c:\\Users\\dxf\\Desktop\\NODEJS\\hello.js',loaded: false,children: [],paths: ['c:\\Users\\dxf\\Desktop\\NODEJS\\node_modules','c:\\Users\\dxf\\Desktop\\node_modules','c:\\Users\\dxf\\node_modules','c:\\Users\\node_modules','c:\\node_modules']   },  '3': 'c:\\Users\\dxf\\Desktop\\NODEJS\\hello.js',  '4': 'c:\\Users\\dxf\\Desktop\\NODEJS' }
*/
=======================
console.log(arguments.callee+''); // 输出当前函数对象
/*
function (exports, require, module, __filename, __dirname) {
var a = 10;console.log(arguments);
console.log(arguments.callee+''); }
*/

说明模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传进了5个实参
这个函数时 function (exports, require, module, __filename, __dirname)


函数中的参数分别代表

exports :该对象用来将变量或函数暴露到外部
require :该对下给你用来引入外部的模块
module :代表当前模块本身,exports时module的属性,所以既可以使用module.exports导出,也可以直接exports导出
__filename :当前模块的完整路经
__dirname:当前模块所在文件夹的完整路径

module.exports可以将要暴露的内容以对象形式暴露

module.exports = {a:1,b:2,fn:function(){console.log('这是一个函数')}
}

模块化其他使用看这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_11699.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打造自己的专属搜索引擎2

需求的来源 其实这个需求的来源,就是平时使用搜素引擎的时候,比如百度、谷歌、必应等,搜索的结果并不是锁定在我们的一个目标范围内。假设我现在需要在CSDN这个社区内寻找java的内容,在使用上述搜索引擎的时候,特别是某…

论文总结6接5 HPLC结合聚类分析法+向量机

一、聚类分析 1.方法介绍 系统聚类分析是一种将研究对象分为相对同质的群组的统计分析技术,建立一种分析不同类型玻璃中14种化学成分的HPLC方法,对两种玻璃中的成分含量进行测定,并结合系统聚类分析法对不同种类玻璃的化学成分进行分析。 …

Maven 依赖项管理依赖范围

依赖管理使用坐标导入jar包1、在pom.xml 中编写 <dependencies> 标签2、在 <dependencies> 标签中使用 <dependency> 引入坐标3、定义坐标的 groupId, artifactId, version4、点击刷新按钮,使坐标生效 依赖范围通过设置坐标的依赖范围(scope),可以设置对…

关于jQuery实现轮播图和基本属性的操作

write less do more ——写得少做的多 通过 封装技巧&#xff0c;把原生DOM操作进行了封装 代码简化自动遍历函数重载机制-制作多功能的函数 用法&#xff1a; $:万能的函数 $(字符串)&#xff1a;当成是选择器来使用&#xff0c;找到元素里面的JQ对象$(DOM)&#xff1a;元素…

spring cloud 集成seata记录

spring cloud 集成seata记录 下载安装包 地址 解压 配置 解压后是没有config.txt文件的&#xff0c;需要新建三个文件 1. config.txt 放在seata根目录下 这个文件要修改下面几个地方 这里要对应配置文件的这里 注意&#xff1a;这里有个坑&#xff0c;部署到服务器上面会…

算法入门之队列

算法入门之队列 前言 队列和栈及其类似&#xff0c;队列在现实生活中的例子就是隧道&#xff0c;单通道一条线&#xff0c;先进去的先出来&#xff0c;后进去的后出来。 在算法中的队列也是这样 队列中从队头位置出队&#xff0c;从队尾入队&#xff0c;队列中的元素永远是先…

三问 Python:能干什么?为什么火?会继续火吗?

前段时间&#xff0c;博主的学校出了毕业率的统计报告。基本就业率都有90%,由于我的大学里面并没有开设Python的学习课程&#xff0c;这意味着没有python的校招&#xff0c;在我的大学开设的主流课程还是java&#xff0c;c之类的。 没有校招&#xff0c;就是要自己去外面面试了…

【刷题日记】8.二分查找

目录 题目链接&#xff1a;704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 一、题目介绍 二、思路 左闭右闭区间写法 三、代码 总结 题目链接&#xff1a;704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 一、题目介绍 这道题就是基本的二分查找&#xff…

JavaScript面向对象

一、面向过程和面向对象 1、两大编程思想&#xff1a;面向过程和面向对象 面向过程编程&#xff08;OPP&#xff09; 装修房屋的流程&#xff1a; ​ 1.找张三设计&#xff0c;你要给张三提供房屋结构图纸 ​ 2.找李四安装水电&#xff0c;你要给李四买好水管电线 ​ 3.找…

室友打了一把王者我学会了CMake的使用(初学者必备)

CMakeCMake介绍CMake安装以及简单的使用利用CMake生成动静态库链接动静态库CMake介绍 CMake是开源、跨平台的构建工具&#xff0c;可以让我们通过编写简单的配置文件去生成本地的Makefile&#xff0c;这个配置文件是独立于运行平台和编译器的&#xff0c;这样就不用亲自去编写…

web协议-接口测试-Python自动化面试题

1、http和https的区别 http是超文本传输协议&#xff0c;端口是80 https是由SSLhttp协议构成&#xff08;https多了个加密协议&#xff0c;比http更安全&#xff09;&#xff0c;端口是443 2、TCP和UDP的区别 两者都属于传输层协议 TCP是面向连接的&#xff0c;建立TCP需要三…

Mysql主从切换流程

Mysql主从切换流程1.Mysql 版本2.场景3.环境4.切换步骤4.1 切断应用对主库的流量4.2 主库备库设置只读4.3 查看备库复制进程状态4.4 比对主备两边的GTID是否一致4.5 确认是否真正同完4.6 从库停掉复制进程并清空主从信息4.7 从库关闭只读开启读写&#xff0c;转为新主库4.8 主库…

在线反馈,急速解决,移动云视频客服让沟通从此不设限

对于产品而言&#xff0c;用户体验至关重要&#xff0c;而客服的服务质量就是用户体验的“灵魂”。随着移动云多达230全栈产品在云计算市场中的热卖&#xff0c;人们在使用产品中难免也会产生诸多问题&#xff0c;考虑到消费者在与客服沟通时打字描述太繁琐&#xff0c;在线沟通…

九零后程序员心塞:“30岁,月薪还没过万,是我的问题吗”

2020年有职场专家指出&#xff1a; 四千元的月薪&#xff0c;在国内算是中等的薪资水平。 每个月能赚到四千块&#xff0c;就打败了一半的国人&#xff1b; 如果每个月能赚8000~10000&#xff0c;那你就能跑赢90%的国人。 这几个数字是怎么得出来的&#xff1f; 我们可以从两…

上次没砍我的,这次我又来了;看完这篇还不明白 Binder 你砍我

最近一段时间由于工作&#xff0c;接触到 Framework 部分比较多一点&#xff0c;也难免要和 Binder 打一些交道&#xff0c; 因为在 Android 系统中&#xff0c;每一个应用程序都是由一些 Activity 和 Service 组成的&#xff0c;这些 Activity 和 Service 有可能运行在同一个进…

java基于springboot+vue的旅游心得分享攻略系统 elementui

SpringBoot是当前最流向的一个框架&#xff0c;它的配置更加的简单&#xff0c;使开发变得更加的简单迅速。 Spring Boot 的基础结构共三个文件&#xff0c;具体如下&#xff1a; src/main/java&#xff1a;程序开发以及主程序入口&#xff1b; src/main/resources&#xff1a;…

vue serve及其与vue-cli-service serve之间的关系

vue serve及其与vue-cli-service serve之间的关系 目录 vue serve及其与vue-cli-service serve之间的关系 一、前言 二、vue命令 三、package.json的preset预置的配置命令参数 3.1、依赖与开发依赖 3.2、vue/cli-service 的内部 3.3、vue -***命令如何跑起来 四、vue …

HTML篇三——(2)

目录一、HTML常用标签1.5 文本格式化标签1.6 <div> 和<span>标签一、HTML常用标签 标题标签、段落标签、换行标签见&#xff1a;https://editor.csdn.net/md/?articleId126970642 1.5 文本格式化标签 文本格式化标签是为文字设置粗体、斜体以及下划线等效果&am…

有了这个 Python 库,以后再也不用写正则表达式了

正则表达式大家应该有了解过吧&#xff1f;它功能很强大&#xff0c;但有一个痛点就是不太容易读写&#xff0c;我们需要了解正则的很多语法规则才能写出一个健壮的正则表达式&#xff0c;很多朋友估计听到正则表达式估计都焦头烂额了。 就没有解决办法吗&#xff1f; 有的&a…