Javascript模块化

65 阅读3分钟

1、模块化概述

1.1 什么是模块化

将程序文件按照一定规则拆分成多个文件,这种编码方式就是模块化。拆分出来的每个文件就是一个模块。

1.2 模块化解决了什么

1、全局数据污染。 2、依赖混乱。 3、数据的安全问题。

2、模块化规范有哪些

2.1、CommonJS

CommomJS在服务端应用广泛,其诞生主要是为了解决node.js开发中的模块化规范问题。也可以在浏览器端运行,但是需要经过编译(通过browserify编译后,在导入使用)。

2.2、ES6模块化

ES6模块化在浏览器端应用广泛,ECMA官方的模块化规范。

2.3、AMD
2.4、CMD

3、导入和导出

模块化的核心就是:模块之间相互隔离,模块的数据私有,通过导入和导出进行数据和功能的共享。

导出:

模块暴露其内部的变量和函数,让其导入该部分的模块使用。

导入:

模块引用其他模块导出的内容,重用这部分代码和功能。

4、CommonJS的使用

4.1 导出

可以使用①、exports.xxx = xxx ②、module.exports = {...} ③、this.xxx = xxx

 const name = 'zhangsan'
 const Fn = () => {
     console.log(name)
 }
 //导出方法1
 exports.name = name
 exports.Fn = Fn
 //导出方法 2.1
 module.exports = {
     name,
     Fn
 }
 //导出方法 2.2
 module.exports.name = name
 module.exports.Fn = Fn
 
 //方法3
 this.name = name
 this.Fn = Fn

注意:

1、每个模块内部的this、exports、module.exports 在初始时都指向同一个空对象,该空对象就是当前模块要导出的数据。

2、无论如何修改导出对象,最终导出的都是module.exports的值

3、所以可以使用module.exports = {...} 而不能使用exports = {...}。ps:更不能使用this = {...},会报错 SyntaxError: Invalid left-hand side in assignment

4.2 导入

使用require导入

// 假设 从./test.js 中导出了 module.export = {name:'zhangsan', Fn:()=>{}}

//导入方法1 可以是绝对路径也可以相对路径
const module_1 = require('./test.js')
 //导入方法2 可以对导入的数据进行结构或者重命名
const {name:MyName, Fn} = require('./test.js')

4.3扩展

一个js模块在执行时是被包裹在一个内置函数中执行的,所以每个模块都有自己的作用域。通过一下代码可以验证。

console.log('arguments', arguments.callee.toString())
//控制台会输出 以下内容
function (exports, require, module, __filename, __dirname) {
    console.log('arguments', arguments.callee.toString())
}

5、ES模块化的使用

5.1 导出数据

ES6模块化提供三种导出方式①、分别导出 ==> export const a = xxx; ②、统一导出 ==>export {a, b, c} ③、默认导出 ==> export deafult xxx (导出方式可以混用,即用默认导出同时也可以使用 分别导出和统一导出)

const name = 'zhangsan'
const testFn = ()=>{}
//分别导出
export const age = 10
export const Fn = ()=>{}
//统一导出 --此处导出的并不是对象,而是类似对象的一种结构
export {
  name,
  testFn
}
//默认导出
export default {
    name,
    testFn
}

5.2 导入数据

ES6使用import导入,导入方式有①全部导入; ②默认导入; ③命名导入; ④动态导入

//通用  全部导入
import * as allVal from '.test.js'
//默认导入
import module_2 from './test.js' 

//命名导入 
import {name, testFn} from './test.js' 

//默认导入和命名导入混用 并且给命名导入中的一个数据重命名
import module_2, {name as myName, testFn} from './test.js' 

//动态导入
const dt = ()=> import('./test.js')