5.31_Nodejs构建服务器-文件系统-模块化

补充(for in)

 <script>
    var obj = {
      name:"张三",
      age:18,
      gender:"男"
    }
    // i 遍历的就是属性名
    // 获取属性值  对象名[i]
    for (const i in obj) {
      console.log(i);
      console.log(obj[i]);
    }
  </script>

01 、Nodejs 介绍

1、什么是node?
基于chrome V8引擎的JavaScript运行环境。

2、 js:运行在浏览器, 开发前端程序。
node:运行在服务器 ,开发后端程序。

3、静态页面:数据都是写死的。HTML+CSS+JS
动态页面:数据都是动态的。HTML+CSS+JS+后端接口

4、为什么要学习node?
(1) 中小型项目快速开发
(2) 全栈:前端,后端都可以做(全干)。


02、Nodejs的下载与安装

2.1

1、node中文网站:nodejs.cn。14版本只有win8以上才支持。

2、安装:下一步直到结束。

3、检测是否成功:
3.1 命令行(cmd)在任意位置结合shift右键

3.2 在VScode中打开终端(ctrl+`):
node --v (node --version)。如果成功显示版本号说明node安装成功了。

3.3 npm -v (npm是node自带的包管理工具)
【注意】如果在vscode中不能运行npm,则输入set-ExecutionPolicy RemoteSigned。

2.2 初始化node项目:生成package.json 这个项目的配置文件

npm init 逐步设置配置文件
npm init -y 快速生成配置文件

  ECMA语法
  BOM
  DOM
对于node来说,
  只有ECMAScprit,没有BOM和DOM,不过多了一些文件操作和IO流等等功能。

03、试用node执行js

node执行js:在命令窗口:使用 node.js文件的路径 ,按下回车即可。


04、模块化

4.1 面临的问题

如果你是未使用模块化之前的毕业生,你在接收项目时,可能会遇到的问题:

  1. 变量名冲突:不同文件中的变量如果重名,前面的会被后面的覆盖,造成程序的执行错误。
  2. 文件依赖顺序:多个文件之间如果存在依赖关系,需要保证加载顺序的准确。

4.2 什么是模块化

模块化本质:就是一个实现特定功能的js文件。

模块化开发:是一个管理方法,是一种生产方式,解决问题的方案。

模块化可以让我们更方便的使用已经写好的代码,想要实现什么功能,就加载什么模块。
就像积木,需要拼接什么形状,就使用相应的积木。

4.3 模块化的方案

4.3.1 闭包和函数作用域

利用闭包和自执行函数

var 模块名 = (function(){
	....
	return {
		变量1,
		变量2
	}
})(引入其他的模块名...)

模块名.变量

这种方法是所有模块化的基础。

  1. 各个文件之间避免了变量名的冲突。
  2. 减少了全局变量。
  3. 模块的外部无法修改闭包内部的变量,增加程序的稳定性。
  4. 明确了依赖关系。

4.3.2 ES6模块化

在ES6之间,是没有模块化的概念的.
如果要使用模块化的操作:一种是闭包+自执行函数,一种是引入第三方的类库。

ES6第一次支持了模块化,多个两个模块:export 导出m模块、import 导入模块。

导出模块的两种方式:
(1)exports.模块名 = 模块;
(2)module.exports = 模块;

export 变量的声明赋值
import {变量名} from “模块路径”

【注意】在引入模块文件时,需要在script标签中添加type属性,属性值为 module。
如果需要抛出多个变量名,则可以将这些变量包装成对象输出。如果不想暴露模块中的变量名,可以通过as来操作。

var aNum = 10;
var aStr = "a";
export {
  aNum as num,
  aStr as str
}

接收:

import {num,str} from "./a.js";

console.log(num,str);

4.3.3 默认导出

一个模块只能有一个默认导出,对于默认导出,导入的名称可以和导出的名称可以不一样。

export default function(){
  console.log("此去泉台招旧部,旌旗十万斩阎罗");
}

import ss from "./a.js";
ss();

可以导出对象:

export default {
  fn(){
    console.log("此去泉台招旧部,旌旗十万斩阎罗");
  },
  age:18
}

import ss from "./a.js";
ss.fn();
console.log(ss.age);

基础导出和默认导出:

export default {
  fn(){
    console.log("此去泉台招旧部,旌旗十万斩阎罗");
  },
  age:18
}

export let userName = "zhangsan"

import ss,{userName} from "./a.js";
ss.fn();
console.log(ss.age);
console.log(userName);

05、默认导出多个

1、a.js如下:

	export default {
	  fn(){
	    console.log("此去泉台招旧部,旌旗十万斩阎罗");
	  },
	  age:18
	}

2、b.js如下:

	import ss from "./a.js";
	ss.fn();
	console.log(ss.age);

3、index.html如下:

	<!DOCTYPE html>
	<html lang="en">
	<head>
	  <meta charset="UTF-8">
	  <meta http-equiv="X-UA-Compatible" content="IE=edge">
	  <meta name="viewport" content="width=device-width, initial-scale=1.0">
	  <title>Document</title>
	  <script src="b.js" type="module"></script>
	</head>
	<body>
	  
	</body>
	</html>


06、混合使用


 
1、a.js如下:

	export default {
	  fn(){
	    console.log("此去泉台招旧部,旌旗十万斩阎罗");
	  },
	  age:18
	}
	
	export let userName = "zhangsan";

2、b.js如下:

import ss,{userName} from "./a.js";
ss.fn();
console.log(ss.age);
console.log(userName);

3、index.html如下:

	<!DOCTYPE html>
	<html lang="en">
	<head>
	  <meta charset="UTF-8">
	  <meta http-equiv="X-UA-Compatible" content="IE=edge">
	  <meta name="viewport" content="width=device-width, initial-scale=1.0">
	  <title>Document</title>
	  <script src="b.js" type="module"></script>
	</head>
	<body>
	  
	</body>
	</html>


07、node的模块化


1、a.js如下:

	function fn1(){
	  console.log("我是a模块中的fn1函数");
	}
	function fn2(){
	  console.log("我是a模块中的fn2函数");
	}

// module对象是node自带的模块化对象,该对象下有一个空对象,exports。
我们将需要暴露出去的对象,直接赋值给exports即可,就对外暴露了接口。
// 暴露
	module.exports = {
	  fn1,
	  fn2
	} 

2、b.js如下:

	function fn1(){
	  console.log("我是b模块中的fn1函数");
	}
	function fn2(){
	  console.log("我是b模块中的fn2函数");
	}
	// 暴露
	module.exports = {
	  fn1,
	  fn2
	}

3、test.js如下:

// 在需要引入的模块中,使用require引入,用变量接收。
// 格式: let 变量名 = require(“模块路径”);

	let moduleA = require("./a.js");
	let moduleB = require("./b.js");
	moduleA.fn1();
	moduleA.fn2();
	moduleB.fn1();
	moduleB.fn2();

08、导入的另外一个写法

1、a.js如下:

	function fn1(){
	  console.log("我是a模块中的fn1函数");
	}
	function fn2(){
	  console.log("我是a模块中的fn2函数");
	}
	exports.fn1 = fn1;
	exports.fn2 = fn2;

2、b.js如下:

	function fn1(){
	  console.log("我是b模块中的fn1函数");
	}
	function fn2(){
	  console.log("我是b模块中的fn2函数");
	}
	// 暴露
	module.exports = {
	  fn1,
	  fn2
	}

3、test.js如下:

// 在需要引入的模块中,使用require引入,用变量接收。
// 格式: let 变量名 = require(“模块路径”);

	let moduleA = require("./a.js");
	let moduleB = require("./b.js");
	moduleA.fn1();
	moduleA.fn2();
	moduleB.fn1();


09、exports和module.exports的区别和相同点

  1. exports可以多次导出,但是module.exports只能导出一次,多次导出最后一次生效。
  2. exports和module.exports本质是相等的。
  3. exports是一个引用,指向的是module.exports。
  4. 如果在同一个文件中使用两种导出,给exports添加的属性和方法,也会添加在module.exports上,但是添加在module.exports上的属性和方法,不会添加在exports上。

10、文件读取

  • node的模块大致可分为三大类:

  • 1.内置模块(nodejs原生提供的)可以直接使用。

  • 2.自定义模块 (需要手动的导出)。

  • 3.第三方模块(需要下载安装然后才可以使用)。

  • 自定义模块:

  • 定义模块:

  •  通过module.exports = 模块          导出模块                                                                                                                                                                                                                                                             
    
  •  通过exports.属性名(模块名) = 模块        导出模块
    
  • 引入模块:

  •  const 变量名 = require("模块路径")
    
  • node可以操作文件,可以创建服务器,可以连接数据库等等。

  • 读取文件:

  • 1.引入fs内置模块

  • 2.调用readFile方法

  • 3.指定读取文件的路径

  • 4.指定读取的编码

  • 5.回调函数 读取的时候执行的操作。

  • 6.err 是读取失败时的错误信息

  • 7.data 是读取的内容。


// 1.引入fs内置模块 这个模块是专门用来操作文件的

const fs = require("fs");                              //引入文件系统模块         
fs.readFile("./b.txt",'utf-8',function(err,data){    // 2.readFile 方法 是读取文件中的内容
  console.log("错误信息为"+err);                    // function后是回调函数
  console.log("读取到的内容为"+data);
})

11、文件写入

**1.引入fs内置模块 写入**

const fs = require("fs");
let data = "hello world";
                  // writeFile 方法是写入,覆盖式  第一个参数:写入文件的路径
                  // 第二个参数:写入的内容。
                  // 第三个参数:一个函数,写入完成后执行. err表示错误信息,如果成功执行,则err为null
fs.writeFile("./a.txt",data,function(err){
  if(err){
    console.log(err);
  }
})

**2.appendFile 追加**

const fs = require("fs");
let data = "花开花落";
fs.appendFile("./a.txt",data,function(err){
  if(err){
    console.log(err);
  }
})

eg:读取a.txt文件,将a.txt文件的内容写入到b.txt。

a.txt:床前明月光,疑似地上霜。  (另存为utf-8)
b.txt:

index.js如下:

	const fs = require("fs");
	fs.readFile("./a.txt","utf-8",function(err,data){
	  if (err) {
	    console.log("读取失败:"+err);
	    return;
	  }
	
	  
	  fs.writeFile("./b.txt",data,function(err){
	    if (err) {
	      console.log("写入失败:"+err);
	    }
	  })
	})
	
【注意】b.txt里将写入a,txt里的内容。

12、文件读写

const fs = require("fs");
fs.readFile("./a.txt","utf-8",function(err,data){
  if (err) {
    console.log("读取失败:"+err);
    return;
  }
  fs.writeFile("./b.txt",data,function(err){
    if (err) {
      console.log("写入失败:"+err);
    }
  })
  
})
上一篇:理解exports和module.exports,就这么简单


下一篇:export和export dafault以及exports和moudle.exports的区别