初识node.js
node.js是javascript运行的一个环境 基于chrome浏览器的v8引擎
node.js的特点: 事件驱动,无阻塞的io模型,使node轻量高效
包生态系统---->npm node package manager是一个客户端工具 世界上最大的包管理系统
浏览器与node.js运行js的模型
1 浏览器与js的关系 被动
2 node.js 与js的关系 主动
3 node.js 如何运行js 文件
答:node +文件路径,node是调用已经安装的node应用程序
文件路径是给node 传的一个参数
如何执行js文件
1 用node执行js文件,文件在当前目录下---->node +文件名
2 如果不在当前目录下,node +文件路径的形式执行
相对路径
./ 当前路径
../ 上级目录
绝对路径执行js的方式
node c:\Users\cena\Desktop\code\01helloworld.js
注意点:不能跨盘去调用js文件
js的引擎
1 转化: 汽油转化能量
例如: 模板引擎 模板+数据---》页面
js引擎 js代码--->可以被电脑运行的代码
2.移植 node是给v8引擎套了一个壳
node 的应用场景
1 读写文件
2 写网站后端(服务器)
总结:
注意点: node 是后台的技术,是门技术不是语言,使用js干后台干的事情
如何确认是否安装成功?
`win + r` ,然后输入 `cmd` ,然后敲回车 就可以进入 cmd 控制台
node -v
node 的群居环境
global和window很像,都是全局对象
node运行js的时候一个js里面的代码的作用域就是这个js
node.js 得模块化
1 一个js文件就是一个模块,模块里面的代码的作用域就在这个文件中
优点 1.一次编写多次使用
2.便于维护
2. node的模块化符合commonjs规范
所谓的模块化开发其实也就是如何有效的组织你的JavaScript代码
全局函数直接写到html中
将js代码提取出来放到单独的js文件中
封装对象的方式解决全局函数面临的问题
给对象加入独立的作用域空间
commonjs规范
希望JavaScript可以在任何地方运行,以达到像Java、PHP、Ruby、Python具备开发大型应用的能力
出发点:
没有模块系统
标准库较少
缺乏包管理系统
1. 模块引用require
2. 模块定义
一个文件就是一个模块
将方法挂载到exports对象上作为属性即可定义导出的方式
3. 模块标识
必须是符合小驼峰命名的字符串
以.、..开头的相对路径
绝对路径
可以没有文件名后缀.js
commonjs 特点
所有代码都运行在模块作用域,不会污染全局作用域
模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就缓存了,以后再加载,就直接读取缓存结果。
模块加载的顺序,按照其在代码中出现的顺序
node.js 模块介绍
Node程序由许多模块组成,每个模块就是一个文件。Node模块采用了CommonJS规范。
Node.js本身就是一个高度模块化的一个平台
根据CommonJS规范,每一个模块都是一个单独的作用域
CommonJS规定,每个文件对外的接口是module.exports对象,该对象所有属性和方法,都可以被其它文件导入。
module 模块对象
module.id 带有绝对路径的模块文件名
module.filename 模块的文件名,带有绝对路径
module.loaded 表示模块是否已经完成加载
module.parent 返回一个对象,表示调用该模块的模块。
module.children 返回一个数组,表示该模块要用到的其他模块。
module.exports 模块对外输出的值
当运行js的时候,有一个js,node 就会为其创建一个module去存储这个js的相关信息
module.exports 全局对象
module.exports属性表示当前模块对外输出的接口,其它文件加载该模块,实际上就是读取module.exports属性
点儿导出单个函数、对象或者值的时候非常有用,本质上就是少了一个.
module.exports 打破封装性,通过模块间传递module.exports对象,来打破封装性
module.exports 是全局的对象,初始值是空对象
暴露什么(方法、对象、数字)都行
module.exports=123 使用直接赋值的形式只能使用一次
module.exports.foo=123;
module.exports.bar=456;使用属性赋值的形式能够使用多次
exports替代module.exports在属性赋值的时候使用
require 全局方法
第一次加载js(module)的时候,会执行一遍js里面的代码
第二次加载js的时候,不执行js代码的,直接去内存中找到第一次加载js对应的module对象,
从中找到module.exports
exports
exports 是module.exports的别名,外号、花名
模块化总结
1. 模块化的代码具有封装性,对代码进行包装,我想让你用什么接口,使用什么
2. 有封装就有打破封装,需要给别人开接口 module.exports exports
3. module.exports直接赋值
4. exports 当一个js中有很多的属性很方法的时候,就使用exports向外曝露
5. 一个js文件就是一个模块
6. 一个模块的信息被保存在module对象里面,每一个模块都有一个module与之对应
module对象产生了以后,第二次加载就不会再去执行,而是去内存中的module对象中找module.exports
模块得种类
第一类,核心模块(原生模块),node自带,用名称直接可以加载。
核心模块
+ fs file system 文件系统
+ http 制作网站的
+ os 获取电脑信息
+ path 路径拼接用的
+ query
+ url
...
require('fs')
核心模块存在的意义,
我们需要node给我们提供一些方法,让我们可以方便的去处理电 脑的硬件,
第二类,文件模块,用路径加载,有一种特殊的文件模块----->包,可以用名字。
什么是3m?
npm nrm nvm
require 参数解析
require('./foo');
require('fs');//
引入一个叫fs的模块,node会帮我们把fs加载进来
var fs=require('fs');
fs.readFile() 读文件
参数:1 路径
2 编码格式
3 回调函数 1,err错误对象 2 读得参数
fs.readFile('路径','utf8',function(){
})
包
还有一种特殊的文件模块,其实就是包
包的作用:在模块的基础上进一步组织JavaScript代码
包得组成
包结构
包就是一个文件夹,文件夹的名字最好是包名。
(1、2是必选项)
1. 入口文件 index.js或app.js 写大的应用例如网站的时候,叫app.js
2. 包说明文件,不只是给人看的~~~~---->package.json
3. lib文件夹 存放js文件的
4. bin文件夹 二进制文件或者脚本文件
5. test 测试文件夹
6. docs 文档放这里
7. node_modules 如果我需要引入别的包,不能改
8 包描述文件package.json
描述你的当前的包的一些相关的信息
package.json 属性解释
- name 包名
- version 版本号
- description 包的描述
- main 入口文件
- keywords 关键词
- author 作者
- repository 代码库地址
- bugs 提交地址
- license 许可证
- devDependencies 开发环境包依赖
- dependencies 生产环境包依赖
+ dependencies
- 包名:“版本号”
- > +版本号 下载大于某个版本号,npm会下最新版
- < +版本号 下载小于某个版本号,npm会下小于这个版本号最新版
- <= 小于等于 一定会下你写的这个版本,除非没有你写的这个版本
- >= 大于等于 下载最新版
- *、" "、X 任意 npm会给你下最新版
- ^ +版本号 不跃迁版本下载,^2.1.0 npm会下载大版本不变,去下载2.x.x版本里的最近版
- ~ +版本号 会去下约等于这个版本的最新版,在大版本不变的情况下下一个比较新的版本
语义化版本号
1.2.3
1表示重大更新
2表示向下兼容
3表示补丁包更新
npm
即为node package manager 得缩写
(通过 npm help 查看命令列表
npm –l 查看各个命令的简单用法)
- 基于Node.js开发的包的托管网站
- Node.js包管理工具
npm :基于包的规范实现的一个包管理工具
1 npm init 初始化一个package.json
2 npm install 安装package.json里面设定好的依赖的包
- npm install 包名
npm i jquery@3.2.1
3 npm install --save 生产环境
npm i -S jquery
4 npm install -g 包名 只要是全局安装就是安装命令行工具
- npm install 缩写 npm i
- npm install -save-dev 开发环境
npm i -D jquery
5 npm config set prefix 修改全局安装目录
箭头函数
箭头函数就是一种语法糖
语法糖是一种语法,用这种语法能尝到甜头,能是编程高效
当函数体有一个参数有返回值的时候
var foo=function(v){ return v;}
var foo=v=>v;
当函数体没有参数有返回值的时候
var foo=function(){ return v;}
var foo=()=>v;
当函数体有多个参数有返回值的时候
var foo=function(v1,v2){ return v1+v2;}
var foo=(v1,v2)=>v1+v2;
当函数体有多个参数没有返回值的时候
var foo=function(v1,v2){
console.log(v1); console.log(v2);
}
var foo=(v1,v2)=>{
console.log(v1); console.log(v2);
};