前端代码复杂时出现的问题及解决思路--前端模块化

前端代码复杂时出现的问题及解决思路:

1.命名重复 (使用闭包函数来限制作用域)

(function(){
    var flag = true
})()

2.不能复用 (使用模块作为出口)

在匿名函数内部,定义一个对象

给对象添加各种需要暴露到外面的属性和方法(不需要暴露的直接定义即可)

最后将这个对象返回,并在外面使用了一个ModuleA接收

var ModuleA = (function(){
    //1.定义一个对象
    var obj = {}
    //在对象内部添加变量和方法
    obj.flag = true
    obj.myFunc = function(info){
        console.log(info);
    }
    //将对象返回
    return obj;
})()

接下来我们在main.js中 只需要使用属于自己模块的属性和方法即可

if(ModuleA.flag)
	console.log('调用模块A')
}
ModuleA.myFunc('调用Func')

这些只是模块化的雏形,前端模块化开发已经有了许多既有的方案

常见的模块化规范:

CommonJS、AMD、CMD、也有ES6的Modules

模块化有两个核心:导出导入

CommonJS的导出(webpack里用得到)

module.exports={
	flag:flag,
    sum:sum
}

导入require关键字:

let { flag, sum }=require('./aaa.js');

ES6的模块化实现

export(导出)/ import (导入)

<script src="aaa.js" type="module"></script>
<!--type="module"就不会命名冲突-->

export

导出方式1:

let name = 'xiaoming'
let age = 18
let height = 1.88

export {name, age, height}

导出方式2:定义变量的时候直接导出

export let name ='xiaoming'

3.导出函数/类

export function test(arg){
	console.log(arg);
}

export class Person{
	constructor(name,page){
		this.name = name;
		this.age = age;
	}
	run(){
		console.log(this.name+"run")
	}
}
//或者定义好后统一导出
function test(arg){
	console.log(arg);
}

class Person{
	constructor(name,page){
		this.name = name;
		this.age = age;
	}
	run(){
		console.log(this.name+"run")
	}
}
export { test, Person }

4 .export default

某些情况下,一个模块中包含某个功能,我们并不希望给这个功能命名,而且让导入者可以自己来命名,默认的只能有一个

export default function(arg){
	console.log(arg)
}
//info.js

在main.js中这样使用就可以了

import myFunc from './info.js'
myFunc()

【注意
export default在同一个模块中,不允许同时存在多个

import

1.首先,需要在html代码中引入js文件时,设置type="module"
2.示例

import {name, age, height} from './info.js'
console.log(name, age, height)

3.统一全部导入
通过 * 可以导入模块中的所有export变量
但是通常情况下,我们要给 * 起个别名,方便后续的使用

import * as aaa from './b.js'
console.log(aaa.flag);
posted @ 2020-03-15 01:16  某星座的海星  阅读(763)  评论(0)    收藏  举报