node.js - http、模块化、npm
今天是node学习的第二天,其实越往后面学越感觉有点熟悉的味道了,光针对于node来说哈,为什么呢,因为我之前学过一点云计算的东西,当时感觉没什么用搞了下服务器客户端这些,没想到这里还能用一用,至少看到服务器这些概念一点不陌生,看到npm一点不奇怪,我当时用的都是yum。
1.
我们今天先看到http模块,也是node里面的第一大模块,内置模块的内容,http是创建web服务器的模块,在前端当中,不需要iis、Apache这些第三方服务器软件,只需要一个node.js提供的http模块就能够写一个服务器,这么一看,貌似node还多强大的。
我们的服务器一般分为三个概念,ip、域名、端口,有了这三个你就可以访问一个服务器。
怎么来创建啊web服务器?
首先要导入http内置模块
const server = http.createServer()
这个创建了一个服务器实例,接下来还要对他绑定一个监听事件,能够监听到客户端发送过来的请求
server.on('request',(req, res) => {})
注意这个事件里面有两个参数,这两个参数代表什么意思我们后面再说,当你绑定完事件过后,就可以开启这个服务器了
server.listen(‘端口号’,callback)
这里面两个参数一个填端口号,一个是开启服务器后的回调函数。
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => console.log('someone visit our webServer'))
server.listen(83, () => console.log('开启成功'))
浏览器上访问 服务器过后就会在服务器的终端弹出来监听里面要打印的信息
1.1
我们接下来说一下监听事件里面两个参数到底是个什么?
首先第一个req对象,它是一个对象,包含了客户端相关的数据和属性,你要对访问进来的客户端记性操作的话,尽管用到这个对象里面的属性和方法即可
req.url是客户端请求的url地址 req.method是客户端的请求方式
const http = require('http')
const server = http.createServer()
server.on('request', req => {
const url = req.url
const method = req.method
console.log(`your request url is ${url} and your request method is ${method}`)
// post请求借助postman
})
server.listen('80',() => console.log('server is running in http:127.0.0.1'))
1.2
然后是res对象,没错,他也是一个对象,这是包含了服务器相关属性和数据的对象
res.send()可以向客户端发送你想发送的内容,而且它代表着请求结束,如果发送的内容里面包含中文的话,还需要用到res来设置表头编码不然会出现乱码的现象
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
let str = 'your request url is '+req.url+' + your request method is '+req.method+''
res.end(str)
})
server.listen(80, () => console.log(
'server is running at http://127.0.0.1'
))
1.3
来一个案例,根据不同的url反映出不同的页面,这个应该很经典吧
// 1.获取到用户的url
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
let url = req.url
// 2.设置默认的页面为404
let content = `<h1>404 Not Found</h1>`
// 3.判断用户是否请求的是首页
if (url == '/' || url == '/index.html') {
content = `<h1>首页</h1>`
// } 4.判断用户是否访问的是分页
} else if (url == '/son.html') {
content = `<h1>子页</h1>`
}
// 5.设置请求头 防止中文乱码
res.setHeader('Content-Type', 'text/html; charset=utf-8')
// 6.发送内容并结束请求
res.end(content)
})
server.listen(80, () => console.log('your request is running at http://127.0.0.1'))
2.
我们接下来看到模块化,模块化是指解决一个复杂问题的时候,自顶向下逐层把系统划分到若干模块的过程,对于整个系统来说模块是可组合、分解和更换的单元。
在我们编程世界里面,模块化就是遵守固定的规则,把一个大文件拆分成独立并相互依赖的小模块,大家分工合作。
Node.js模块分类?
在我们node里面模块分为三个部分,第一个是内置模块:我们前面学的都是内置模块,fs、path、http等
第二个是自定义模块:什么叫做自定义模块,其实就是我们自己写的这个js文件他就是自定义模块
第三个是第三方模块:就是由第三方开发出来的模块,需要提前下载
然后 我们的模块都需要加载用到require
还会有模块作用域,也就是在我们自定义模块里面声明的变量函数,在外面的模块是访问不到的。
那么有没有办法来访问呢?
是有的,向外共享模块成员的方法要用到一个module对象,它是每个js自定义模块都有的内置对象,然后在这里面有一个关键的对象,exports,在我们前面,require这个自定义模块的时候得到的内容其实就是exports对象里面的内容,
所以说有时候为空,就是因为没给exports赋值,他就是一个空对象,我们在写的时候可以写成module.exports 也可以是exports
module.exports = {
uname : '张三',
sayHello : function() {
console.log('hello node');
}
}
const md = require('./module对象共享')
console.log(md);
但是在模块化这里exports有几个要注意点的,始终要记住一点不管是exports还是module.exports他们虽然能完成一样的效果但是始终以为module.exports里面的数据为准。
为了防止混乱,最好不要将exports和module.exports混用
模块化规范
node遵循的是commenJS模块化的规范,包括我们前面说的module代表当前模块,exports是对外的接口,require用于加载模块都是commenJS规范的,但是我vue入了一点门被劝回来的那里,刚好看到后面应该遵循的都是es6模块化规范了,这个commenJS逐渐要淘汰了。
3
继续看到包和npm的一些内容,首先要明确什么叫包,第三方模块就叫包,包是由第三方个人和团队做出来的,都是免费的。
我们为什么要用包呢?
包是基于内置模块封装出来的,提提供了更高级、更简便的用法,其实就相当于jQuery和浏览器内置对象的关系,jq的ajax方法就是通过xhr封装来的撒。
npm
我们首先看到一个案例对时间格式化如果用我们的传统做法,也就是自定义模块的做法。
const module对象共享 = require("./module对象共享") function timeFormat(dataStr) {
let date = new Date(dataStr)
let y = date.getFullYear()
let m = addZero(date.getMonth() + 1)
let d = addZero(date.getDate())
let h = addZero(date.getDate())
let mm = addZero(date.getDate())
let s = addZero(date.getDate())
return `${y}-${m}-${d} ${h}:${mm}:${s}`
}
function addZero(n) {
return n = n < 10? '0' + n : n
}
module.exports.timeFormat = timeFormat
const time = require('./格式化时间传统做法')
// console.log(time);
const date = new Date()
console.log(date);
console.log(time.timeFormat(date));
这就完成了一个对于时间格式化的操作,舒适还是有点麻烦,但我们现在有了npm就不一样了,可以用npm安装一个moment的包,安装导入查看文档api这三步曲走起。
const moment = require('moment')
const timer = moment().format('YYYY-MM-DD HH:mm:ss')
console.log(timer);
之前多少代码量,现在多少代码量,这就是为什么要用包。
最后说一下当你安装了包后文件夹多多出两个文件一个node_modules的文件夹这里面存放的npm下载的包文件,一个是pachage_lock.json的配置文件这里面是前面文件夹里面所有npm下载的包的详细信息这两个都不能去修改
最后如果要安装指定版本的包的话只需要在包名的后面添加@版本号
node.js - http、模块化、npm的更多相关文章
- 如何发布一个自定义Node.js模块到NPM(详细步骤)
咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...
- 如何发布一个自定义Node.js模块到NPM(详细步骤,附Git使用方法)
咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...
- 模块化开发(三)---通过node.js学习模块化开发
由于改文章有点大,部分代码格式有点问题,编辑之后博客园莫名其妙推出,有问题可以留言沟通. 什么是Node? 它是一个在浏览器之外可以解析和执行javascript代码的运行环 境,或者说是一个运行 ...
- AngularJS 1.x系列:Node.js安装及npm常用命令(1)
1. Node.js安装 1.1 Node.js下载 Node.js官网:https://nodejs.org 当前下载版本(含npm):Latest LTS Version: v6.10.3 (in ...
- node.js介绍和npm的使用
Node.js介绍 打开Nodejs英文网:https://nodejs.org/en/ 中文网:http://nodejs.cn/ 我们会发现这样一句话: 翻译成中文如下: Node.js 是一个基 ...
- 初识node.js(通过npm下载项目依赖的包的过程)
一.初识node.js 简单的说Node.js 就是运行在服务器端的JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事 ...
- Node.js环境搭建&&npm安装
Node.js环境搭建 什么使Node.js呢?我们知道JavaScript开始作为客户端语言,但早已在浏览器端一统江湖,这时,野心越来越大,它就想向服务器端拓展了,于是Node.js就是这样的,我们 ...
- Node.js 最早 npm 包 request 将被废弃
相信 Node.js 开发者对 Request 都不会陌生,这是一个 Node.js 模块,以 npm 包的形式提供,是一个简单的 HTTP 客户端,通过它可方便地实现 HTTP 请求. 可以看到,r ...
- Windows node.js安装运行npm显示类似"ENOENT, stat 'C:\Users\XXXX\AppData\Roaming\npm'错误
这个错误是在玩一个小的博客的时候,使用到node.js,正好使用的是windows系统就安装了一个windows32的node.js版本 结果一运行npm就出现如上的错误,后来发现,只要在上面提到的目 ...
- 下载 node.js 步骤 bower npm 报错解决
1,下载node.js ,安装之后就可以 了 2,解决"npm不是内部或外部命令" ,打开安装的node.js 的文件夹 将这个地址,放在环境变量里面 <1,属性环境 ...
随机推荐
- 开启路由器的TCP拦截
TCP拦截即TCP intercept,大多数的路由器平台都引用了该功能,其主要作用就是防止SYN泛洪攻击.SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击 ...
- ssh编译安装后重启失败问题
编译好的ssh重启出现如下报错 这个原因是因为systemd与ssh不兼容造成的 删掉服务 rm /usr/lib/systemd/system/sshd.service 重启 /etc/init.d ...
- Ubuntu下使用C语言连接Mysql 8.0客户端教程
Ubuntu下如何C语言程序连接MYSQL 8.0(全教程) 1. 安装GCC(略) 2. 安装mysql(本人使用的是最新MySQL 8.0版本) sudo apt install mysql-cl ...
- Cobalt Strike之网站克隆
点击 attack --> Web-dirve-by --> clone file 填写你要克隆的网站.带有端口 Clone URL:克隆目标网站的URL 注意问题:URL需要添加http ...
- C249: 'DATA': SEGMENT TOO LARGE“解决方法 | keilC51设置编译模式:SMALL,COMPACT,LARGE
"Keil Cx51编译器提供三条编译模式控制命令:SMALL,COMPACT,LARGE,它们对变量存储器空间的影响如下. SMALL:所有变量都被定义在8051单片机的片内RAM中,对这 ...
- Mybatis配置错误:java.lang.ExceptionInInitializerError
情况一:配置文件,无法被导出或者生效 修改前: 修改后: 究其原因,这是由于Maven的约定大于配置,导致我们写的配置文件,无法被导出或者生效的问题,解决方案: 在pom.xml文件中配置导出非res ...
- 【编程教室】Python绘制冬奥吉祥物“冰墩墩”
大家好,欢迎来到 Crossin的编程教室 ! 这两天,随着北京冬奥会的开幕,吉祥物"冰墩墩"可是火出了圈,多少人排长队都买不到.据说甚至有人把价格炒到了几千元. 就连昨天的&qu ...
- ClassNotFoundException: org.springframework.web.context.ContextLoadServlet
web.xml中配置 <!-- 配置spring核心监听器,默认会以 /WEB-INF/applicationContext.xml作为配置文件 --> <listener> ...
- Pycharm连接MySQL步骤及注意点
1.数据库连接修改MySQL: 默认:MySQLDB #MySQLDB只支持Python2,暂不支持python3,所以要修改, 修改成:pymysql,在每个项目中都需要先导入pymysql模块, ...
- Spring Cloud第一次请求报错问题
一.原因 我们在使用Spring Cloud的Ribbon或Feign来实现服务调用的时候,第一次请求经常会经常发生超时报错,而之后的调用就没有问题了.造成第一次服务调用出现失败的原因主要是Ribbo ...