Node
- Node.js:不是框架,不是语言,是JS运行时环境。
- Node.js特性:1.事件驱动 2.非阻塞IO模型(异步) 3.轻量和高效
- Node.js没有 BOM 和 DOM
- Node 不适合从来没有接触过服务端的人学习,如果想要真正学好服务端,还是老牌 Java,PHP Node 不是特别适合入门服务端,但是不代表 Node 不强大 Node 很厉害,具有经验的人可以玩的非常牛,不适合的原因就在于比较偏底层,而且太灵活; Java,PHP 好入门的原因在于:这些平台屏蔽了一些底层
安装
Node.js 官方网站下载:https://nodejs.org/en/
一直下一步下一步,别装C盘。
确认Node环境是否安装成功:
启动命令窗口 window+R 然后cmd
输入node --version(简写 -v),会显示当前版本号,则安装Node成功。
- 浏览器中的JavaScript是没有文件操作能力的;但是Node中的JavaScript具有文件操作能力
- 编码工具安装Terminal插件,鼠标右击显示Open in...直接打开当前文件目录
什么是模块化?
- CommonJS模块规范 ····在Node中的JavaScript还有一个很重要的概念:模块系统 ··········模块作用域 ··········使用 require 防范加载模块 ··········使用 exports 接口对象来导出模块中的成员
- 有文件作用域 ·····文件之间通信规则 ··········通过 exports 导出 ··········通过 require 加载 require 是一个方法,它的作用就是用来加载模块的。 require方法有两个作用: ·······1.加载文件模块并执行里边代码 ·······2.拿到被加载文件模块导出的接口对象 加载 require语法: ·······var 自定义变量名 = require('模块') 两个作用: ······执行被加载模块中的代码 ······得到被加载模块中的 exports 导出接口对象
** require 方法加载规则 模块查找机制 1.优先从缓存加载 2.核心模块 3.路径形式的文件模块 4.第三方模块 node_modules node_modules/子文件 node_modules/子文件/package.json index.js 备选项 进入上一级目录找 node_modules 按照这个规则依次往上找,知道磁盘根目录还找不到,最后报错:Can not find module xxx**
导出 exports Node 中是模块作用域,默认文件中所有的成员只在当前文件模块有效,在每一个问及那个模块中提供了一个对象:exports,exports 默认是一个空对象,我们要做的就是把所有需要的被外部访问的变量或者函数什么的等等挂载到 exports 上边。 ······导出多个成员(必须在对象中) exports.a = 123; exports.b = 456; ... 最后拿到的就是一个对象:{a:123;b:456} ······导出单个成员(拿到的就是:函数,字符串...单个对象) module.exports = 'hello' 【 注意】:这种方法如果导出多个,后面的会覆盖前面的。解决办法:导出一个对象{a:hello;b:function(x,y){return x+y}
exports 和 module.exports 的区别?
在Node中,每个模块都有一个自己的module对象,module对象中有一个exports对象,我们需要把导出的成员都挂载到module.exports接口对象中,但是写法啰嗦,为了方便书写,在 module模块中又提供了一个成员叫:exports,也是一个对象,默认为空,exports === module.exports,结果为true。当需要导出多个成员时,用exports 和 module.exports 都可以;但是注意如果只导出一个成员的时候,则必须使用 module.exports 因为每个模块默认在代码的最后有一句:return module.exports ,exports只是module.exports的一个引用,所以即使为exports从新赋值也没有用;但是这里有一种情况例外,就是用 exports = module.exports 来重新建立引用关系之后,就可以使用 exports 了。谁来 require 我,谁就得到 module.exports
Node中的模块系统
使用Node编写程序主要就是在使用: ······EcmaScript语言 ············和浏览器不一样,在Node中没有 Bom 和 Dom ······核心模块 ···············文件操作的fs ···············http服务的 http ···············url路径操作模块 ···············path路径处理模块 ···············os操作系统信息 ·····第三方模块 ············art-template ············必须通过 npm 来下载才可以使用 ·····自己编写的模块
核心模块
- Node 为 JavaScript 提供了很多服务器级别的API,这些API绝大多数都被包装到了具名的核心模块中,例如:文件操作的 fs 核心模块,http 服务构建的 http模块,path 路径操作模块,os 操作系统信息模块----------使用模块之前必须先引入。核心模块的本质也是文件,核心模块文件已经被编译到了二进制文件中了,我们只需要按照名字来加载就可以了。
- 在Node中,模块有三种: ············具名的核心模块,例如:fs,http ············用户自己编写的文件模块 ············相对路径必须加 ./ 可以省略后缀名 在Node中,没有全局作用域,只有模块作用域,外部访问不到内部,内部访问不到外部,默认是封闭的。既然是模块作用域,那如何让模块与模块之间进行通信,有时候我们加载文件模块的目的不仅是为了执行里面的代码,更重要的使用里边的变量或者函数等等
服务端渲染
- 说白了就是在服务端使用模板引擎
- 模板引擎最早诞生于服务端,后来才发展到了前端 服务端渲染和客户端渲染的区别?
- 客户端渲染比服务端渲染页面显示快
- 客户端渲染不利于 SEO 搜索引擎优化
- 服务端渲染是可以被爬虫抓取到的,客户端异步渲染是很难被爬虫抓取到的
- 所以真正的网站既不是纯异步,也不是纯服务端渲染出来的,而是两者结合来做的 (例如:某东的商品列表就采用的是服务端渲染,目的是为了支持 SEO 搜索引擎优化;而他的商品评论列表为了用户体验,并且也不需要 SEO 优化,所以采用的是客户端渲染)
NPM(node.js写的)
npm(全称:node package manager包管理器),npm是世界上最大的开源库生态系统
git(C语言) hexo(node.js)
推荐书《深入浅出Node.js》
解决 npm 被墙问题
http://npm.taobao.org/淘宝的开发团队把 npm 在国内做了一个备份 安装:淘宝镜像 cnpm: npm install --global cnpm(--global表示安装到全局,而非当前目录,不能省略)
项目目录
1.为了目录结构清晰,我们约定把所有的 HTML 文件都放到 views(视图)目录下;为了方便管理静态资源,img,css,js等,我们把所有的静态资源都存放到 public 目录下。 【注意】:在服务端中,文件中的路径就不要去写相对路径了,因为这个时候所有的资源都是通过 url 标识来获取的,服务器开放了 /public/ 目录,所以这里的请求路径都写成:/public/xxx ;/ 在这里就是url根路径的意思,浏览器在真正发送请求的时候会把 http://127.0.0.1:3000 拼上不要在想文件路径了,把所有的路径都想象成 url 地址 2.. url 的 parse 方法可以把字符串解析成一个对象
Package.json文件
建议每一个项目都要有一个 package.json 文件(包描述文件) 这个文件可以通过 npm init 自动创建出来, package.json里边有一个 dependencies 选项,这个选项在安装第三方的时候会存储我们的第三方包的依赖信息,很有用。 安装第三方包的时候 npm i --save 包名 (只有加 --save 时,这个选项才会保存,不加不保存); 如果不小心删除了 node_modules 也不用担心,只需要执行 npm install 命令就会自动把 package.json 中的 dependencies 中的所有依赖都加载回来。
解决浏览器不识别UTF8编码的问题
在服务器默认发送的数据,其实是 UTF8 编码的内容 但是浏览器不知道你是 UTF8 编码的内容 浏览器在不知道服务器响应内容的编码情况下会按照当前操作系统的默认编码去解析 中文操作系统默认是 gbk 解决方法就是正确告诉浏览器我给你发送的内容是什么编码的 res.setHeader(‘Content-Type’,‘text/plain;charset=utf-8’); res.end(‘hello 世界你好,中文’); //hello 涓栫晫浣犲ソ锛屼腑鏂� 如果发送的是 HTML 格式的,也要告诉浏览器我给你发送的是 text/html 格式的内容
res.setHeader('Content-Type','text/html;charset=utf-8');
res.end('<p>hello node <a rel="nofollow" href=""> 点我 </a> </p>');
常见命令行语言
1.启动命令窗口 window+R 然后cmd 2.进入盘 d:回车 哪个盘+:+回车 3.进入文件 cd 文件名 4.返回上一级文件 cd ../ 5.清空命令行 cls 6.查看文件目录 dir 7.自动补全功能 tab键 8.历史记录 键盘的上下键 9.创建文件 mkdir 文件名 10. 删除文件 rd 文件名 11.运行node文件 .js文件 node 文件名(写一点tab键补全) 12.关闭node运行的环境 Ctrl+c [注]必须在当前文件目录下运行node .js文件 13.进入盘 cd 文件名 一直 cd文件名 14.找到文件目录 按shift+右键----->在此处打开命令窗口 直接运行
npm -v #显示版本,检查npm 是否正确安装。
npm install express #安装express模块
npm install -g express #全局安装express模块
npm list #列出已安装模块
npm show express #显示模块详情
npm update #升级当前目录下的项目的所有模块
npm update express #升级当前目录下的项目的指定模块
npm update -g express #升级全局安装的express模块
npm uninstall express #删除指定的模块
- 查看node版本 node --version
- 查看npm 版本,检查npm 是否正确安装。 npm -v
- 安装cnpm (国内淘宝镜像源),主要用于某些包或命令程序下载不下来的情况 npm install cnpm -g --registry=https://registry.npm.taobao.org
- 安装express模块 npm install express
- 全局安装express模块 npm install -g express
- 列出已安装模块 npm list
- 显示模块详情 npm show express
- 升级当前目录下的项目的所有模块 npm update
- 升级当前目录下的项目的指定模块 npm update express
- 升级全局安装的express模块 npm update -g express
- 删除指定的模块 npm uninstall express
- 更新node 版本 首先需要确保是否安装 n 模块,这个是node升级需要 没有安装执行:npm i n -g -f 检测使用: n --version 更新node命令:n stable
- node 引入模块使用 require var http = require("http")
拓展
所有的联网的程序都需要进行网络通信 计算机中只有一个物理网卡,而且同一个局域网中,网卡的地址必须是唯一的。 网卡是通过唯一的IP地址来进行定位的 DNS 把域名解析成 IP 地址 服务器就是一台24小时不关机的电脑 ···········IP 地址用来定位计算机 ···········端口号用来定位具体的应用程序(所有需要联网通信的软件都必须具有端口号) ···········端口号的范围从0-65536之间 ···········在计算机中有一些默认端口号,最好不要去使用,例如: HTTP 服务的 80端口,我们在开发过程中使用一些简单好记的就可以,例如:3000,5000,8000,8080等没什么含义的 ··········可以同时开启多个服务,但一定要确保不同服务占用的端口号不一致才可以,说白了在一台计算机中,同一个端口号同一时间只能被一个程序占用