一、node.js模块化概念

模块化的概念和python中的模块是一样的概念。node.js中的模块化是遵顼的common.js标准
1.每一个js文件都是一个模块
2.在浏览器端: 浏览器是不认识node.js语法的,必须先要提前编译打包处理

二、模块加载

1.加载内置模块

const fs = require('fs')

2.加载第三方模块

const moment = require('moment')

3.加载自定义模块

const aaa = require('./aaa.js')

三、模块的作用域

模块的作用域主要是为了防止全局变量污染的问题

1.module模块

任何一个js文件都自带一个module模块

[root@node-2 front]# cat m1.js 
const user = 'zhangsan'
console.log(module)
[root@node-2 front]# node  m1.js 
Module {
  id: '.',
  path: '/root/front',
  exports: {},
  filename: '/root/front/m1.js',
  loaded: false,
  children: [],
  paths: [ '/root/front/node_modules', '/root/node_modules', '/node_modules' ]
}

2.exports 发布成员

自定义模块中向外发布成员,就需要使用module.exports来发布向外提供的变量以及函数

2.1 定义自定义模块文件

注意:向外发布函数的时候,函数前边不能加function关键字

[root@node-2 front]# cat m3.js 
module.exports = {
	'user' : 'zhangsan',
	'age': 20,
	test(){
		console.log('我是m3');
	}
}
2.2 引入模块和使用
[root@node-2 front]# cat index.js 
const m3 = require('./m3')
console.log(m3)
console.log(m3.user)
m3.test()
[root@node-2 front]# node index.js 
{ user: 'zhangsan', age: 20, test: [Function: test] }
zhangsan
我是m3

四、ES6模块化规范

简介:

每个js文件都是一个独立得模块
使用import关键字导入其它得模块成员
使用export关键字暴露自己得成员

在node.js中对ES6支持不是很好,ES6标准已经很普及了,大部分浏览器已经支持了了ES6标准。但是仍有极少部分浏览器或者低版本得浏览器不支持ES6标准。所有我们使用babel这个工具对ES6标准得代码转化成ES5规范得代码,然后在node环境中在运行代码。在浏览器中运行也是会转换为ES5标准得代码后在运行
当然我们后期使用VUE框架得时候,这些步骤框架会自动帮我们操作。以下实例就是为了在node.js环境中熟悉ES6语法

1.默认导入导出语法介绍:

1.1 默认导出

在模块js文件中暴露服务

export defaulut {
	需要暴露的变量1,
	需要暴露的变量2,
    函数...
}
1.2 默认导入
import "自定义名称" from 'xxx.js'

自定义名称尽量和模块文件名称一致。

2.安装babel相关包

注意点:此时使用npm安装得包 是局部生效,只在当前项目下生效。如果要是全局安装就是npm -g install

[root@node-2 ~]# cd /root/front/
[root@node-2 front]# npm install  @babel/core @babel/cli @babel/preset-env @babel/node
[root@node-2 front]# ls
node_modules  package.json  package-lock.json

#查看安装得相关包
[root@node-2 front]# npm ls
front@ /root/front
├── @babel/cli@7.19.3
├── @babel/core@7.19.6
├── @babel/node@7.19.1
└── @babel/preset-env@7.19.4
在全局查看,是看不到这些包得
[root@node-2 front]# npm ls -g
/usr/local/node/lib
├── corepack@0.12.1
└── npm@8.15.0

在安装babel/polyfill

[root@node-2 front]# npm install @babel/polyfill

#查看已经安装了完成
[root@node-2 front]# npm ls
front@ /root/front
├── @babel/cli@7.19.3
├── @babel/core@7.19.6
├── @babel/node@7.19.1
├── @babel/polyfill@7.12.1
└── @babel/preset-env@7.19.4

3.创建babel配置文件

在项目根目录下创建配置文件,加入以下配置

[root@node-2 front]# touch babel.config.js
const presets = [
	["@babel/env",{
		targets: {
			edge: "17",
			firefox: "60",
			chrome: "67",
			safari: "11.1"
		}
	}]
	
];

module.exports = {presets};

4.使用ES6语法测试

4.1 创建模块文件
const data1 = 'hello world'
const data2 = 20

function test(){
	console.log('我是m1的test函数!')
}

export default {
	data1,data2,
	test
}
4.2 引用模块文件
[root@node-2 front]# cat index.js 
import m1 from './m1'
console.log(m1)


#这里就看到了我们使用ES6语法暴露的m1模块文件的变量和函数
[root@node-2 front]# npx babel-node index.js 
{ data1: 'hello world', data2: 20, test: [Function: test] }

5.按需导入导出

5.1 模块文件
export const data1 = 'hello world'
export const data2 = 20

export function test(){
        console.log('我是m1的test函数!')
}
5.2 按需要导入

导入的时候就是直接导入模块中的变量名或者函数名了。就不能在自定义名称了

import { data2,data1 } from './m1'


console.log(data1,data2)