目录
什么是Node.js
Node.js是一个javascript运行环境。他让javascript可以开发后端程序,实现几乎其他后端语言实现的所有功能。
Node.js是基于V8引擎,V8是谷歌发布的开源javascript引擎,本身就是用于Chrome浏览器的js解释部分,但是Ryan Dahl将这个V8搬到服务器上,用于做服务器的软件,因此Node.js可以解析js代码
Node.js特性
- Node.js语法完全是js语法,只要你懂js基础就可以学会Node.js后端开发
- Node.js超强的高并发能力,实现高性能服务器
- 开发周期短,开发成本低,学习成本低
浏览器环境与node环境
注意:Blink内核能够对于HTML/CSS中的DOM进行排版解析,确定每一个元素的位置
Node.js与浏览器的差别
- 浏览器是js的前端运行环境,其支持html和css
- Node.js是js的后端运行环境,不支持html和css
- Node.js无法调用DOM和BOM等浏览器内置API
- Node.js中间层提供很多系统级别API(内置模块)如:文件的读写(File System)、进程管理(Process)、网络通信(HTTP/HTTPS)这些功能是浏览器所不具备的
- Node.js没有浏览器的安全级别的限制,使用起来轻松自由
- Node.js同时支持CommonJS和ES模块化系统,而浏览器中,我们才开始看到ES模块正在实现
CommonJS规范
CommonJS的modules模块化规范写法
我们可以把公共的功能抽离成一个单独的js文件作为一个模块,默认情况下面这个模块里的方法或属性外面是没法访问的(针对require方法,不针对script标签)。如果要让外部可以访问模块里的方法或者属性,就必须在模块里通过exports或modlue.exports暴露属性或者方法
暴露文件内容
暴露:module.exports=test
将test方法直接暴露出去
注意:这种方式只能暴露a.js的一个方法,如果暴露多个的话,后面方法的会将前面的方法覆盖
暴露a.js文件的多个方法
暴露:module.exports={test:test,run:run}或简写:module.exports={test,run}
注意:后面是对象形式,暴露test,run方法
暴露:(第二种写法)
export.test=test
expoet.run=run
注意:这里的暴露第一个为导入的值可以随意写名称,第二个为导出的值不可以随意写名称
暴露文件(函数)
//a.js内
function test(){
console.log("test-aa");
}
function run(){
console.log("我要飞的更高");
}
module.exports={test,run}
导入文件(函数)
导入:var a=require("./a")
导入a.js文件
//导入a.js文件
var a=require("./a")
console.log(a);//{ test: [Function: test], run: [Function: run] }
a.run()//我要飞的更高
暴露文件(对象)
// add.js文件内
const add={
msg:"hello add"
}
module.exports={addChange: add}
导入文件(对象)
var get=require("./add.js")
console.log(get.addChange.msg);
注意:
- 导入文件的前提是暴露文件
- 哪里需要用该文件在哪里导入该文件
- 导入的文件里包含暴露的多个模块
- 对于此种导入方式,导入后的名称可以随意写(导入导出对象同样适用)
Node.js命令
查看node.js版本:node -v
执行js文件:node .\文件名
退出当前命令:ctrl+c
npm
含义:node.js的包管理器,用于node插件管理包括安装、下载、管理依赖(package.json)
命令
npm uninstall 包名 (卸载对应模块)
注意:
- node项目里面会用到的模块:node内置模块、第三方模块、自己写的模块
- npm init可以快速构建node.js工程,同时会生成package.json文件
- node.js里面安装的模块会直接放入node_modules中
- 将记录好对应依赖的package.json文件放到一个空项目中然后在此文件中执行npm install就可以在此文件中下载对应的依赖
关于package.json
- package.json是一个json串以key:value形式展现,并且key和value都以字符串的形式展现
- package.json文件里面既可以帮助自己记录自己包的信息,还能记录你下载安装别人包的信息
- package.json内的scripts里面的value为脚本代码json串,里面可以自定义脚本,只需要运行npm run 脚本json的key值就可以执行脚本json对应的value代码
- package.json的dependencies为当前所下载的依赖,这些下载的依赖都放入node_modules中
全局安装nrm
NRM(npm registry manager)是npm的镜像源管理工具,有时候国外资源太慢,使用这个可以快速的在npm源之间切换
手动切换方法:npm config set registry https://registry.npm.taobao.org
查看镜像源:npm config get registry
安装nrm:npm install -g nrm
查看版本:nrm -V
使用nrm:nrm ls查看可选源,其中带*的是当前使用的源
切换nrm:若切换到淘宝——nrm use taobao(taobao为源)
测试速度:nrm test
中国NPM镜像
这是个完整的npm.js,org镜像,你可以用此代替官方版本,同步频率为10分种一次以保证尽量与官方服务同步
npm install -g cnpm --registry=https://registry.npmmirror.com
yarn
安装yarn:npm install -g yarn
注意:先用npm来安装下来,然后再取代npm(npm泪奔)
对比npm的优点
- 速度超快:yarn缓存了每个下载过的包,所以再次使用时无需重复下载。同时利用并行下载以最大化资源利用率,因此安装速度超快
- 超级安全:在执行代码之前,yarn会通过算法校检每个安装包的完整性
ES模块化
使用前
项目内执行:npm init
package.json内添加属性:"type": "module"
导入与导出模块
导出模块
//module.js文件内
const moduleA={
//模块A
}
export default moduleA//默认导出
导入模块
import moduleA from "./module/module.js";//导入modeleA
console.log(moduleA)
注意:default导出方式只能导出一个模块,通过这种导出方式,那么导入的名字可以随意写(对于导入/导出函数同样适用)
导出多个模块
//module.js文件内
const moduleA={
//moduleA模块
}
const moduleB={
//moduleB模块
}
export {moduleA,moduleB}//导出想要导出的模块
导入多个模块
import {moduleA,moduleB} from "./module/module.js";//导入modeleA
console.log(moduleA)
console.log(moduleB);
注意:以{}形式导出可以导出多个模块也可以导出一个模块,但是不管导入多少模块都需要加{}进行导入,并且导出和导入的名字必须一样(对于导入/导出函数同样适用)
多个import导入
//test1.js文件内
console.log("test1");
//test2.js文件内
console.log("test2");
//test3.js文件内
import "./test1.js"
console.log("test3");
import "./test2.js"
执行:node .\test3.js
注意:
- 这里import导入方式仅仅是为了import文件里的内容能够在在被导入的新文件中运行
- 由上面的结果发现,import文件导入依照导入顺序执行,哪个文件先被导入,则哪个文件先执行,但import导入的文件会被提前声明到该文件的最上方,先于该文件内的js代码执行
模块在浏览器上的加载
导入js文件
//add.js内
const add=(x,y)=>{
return x+y
}
export default add
<!--html文件内-->
<!-- 默认为common.js规范,这里改为ES6规范 -->
<script type="module">
import add from "./add.js"
console.log(add(7, 8));
</script>
导入css文件
/* style.css文件内 */
p{
color: blue;
}
/* pattern.css文件内 */
p{
text-align: center;
}
// add.js文件内
//这里的assert{ type: "css"}用于提示js引擎导入的是css文件
import styles from "./style.css" assert{ type: "css"}
import patterns from "./pattern.css" assert{ type: "css"}
//应用css到文档中
document.adoptedStyleSheets=[styles,patterns];
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页面</title>
</head>
<body>
<div>
<p>我是一段话</p>
</div>
</body>
<script src="add.js" type="module"></script>
</html>
注意:
- 这里不能通过file协议来进行访问(跨域),必须在本地搭建http server环境
- 这里面通过js来导入css文件也可以在html文件内的script标签内通过import关键字来导入,不过该js文件需要先导出
解决:线上去拉一个http server
命令:npx http-server
npx可以实现,当我们某一个模块不存在的时候,它可以从互联网上安装一个模块,如今我们安装http server模块
当然,你也可以直接安装live server插件直接文件内右键open with live server更方便