VUE学习四:前端模块化,ES6和ES5如何实现模块化

简介: 这篇文章介绍了前端模块化的概念,以及如何在ES6和ES5中实现模块化,包括ES6模块化的基本用法、默认导出与混合导出、重命名export和import,以及ES6之前如何通过函数闭包和CommonJS规范实现模块化。

导言

一、前端模块化

前端模块化的意义是什么?小项目需要模块化吗?

二、ES6的模块化实现

1. ES6的模块化的出现

ES5以及它之前的js是没有模块化的,如果要进行模块化操作,需要引入第三方的类库。随着技术的发展,前后端分离,前端的业务变的越来越复杂,终于在ES6中引入了模块化的操作。

2. ES6模块化基本用法

es6中,一个模块就是一个js文件,所以我们新建一个模块(js文件)
es6模块化中模块与外部的数据传输是依赖于export(发送)和import(接收)这两个关键字的,下面通过一个例子来理解它们的用法
在module1.js中:

export let name = 'aays';//发送name这个变量

创建一个外部文件index.js,并且码入:

import {name} from './module1.js'//接收name这个变量
console.log(name)//aays

上面是最基本的用法,如果要输出多个变量可以将这些变量包装成对象进行模块化输出:

//模块
let name = 'aays',age = 18
const sex = '男'
export {
    name,
    age,
    sex
}
//外部
    <script type="module">
        import {name,age,sex} from './module1.js'
         console.log(age)//18
    </script>

如果你想给传输过来的变量重新命名(可用于防止暴露模块当中的变量名字或者简化变量名),可以通过as来进行操作,上述代码修改为:

//模块
let name = 'aays',age = 18
const sex = '男'
export {
    name as myname,
    age as myage,
    sex as mysex
}
//外部
import {myname,myage,mysex} from './module1.js'
console.log(myage)//18

如果你不想将export过来的一一解构赋值,那么你可以使用*符号来直接获取整个模块,上述代码修改为

//模块
let name = 'aays',age = 18
const sex = '男'
export {
    name,
    age,
    sex
}
//外部
import * as allmodule from './module1.js'
console.log(`${allmodule.name}今年${allmodule.age}岁
性别${allmodule.sex}`)//aays今年18岁 性别男

3. 默认导出与混合导出

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

//模块
export default function(){
    return "默认导出一个方法"
}
//外部
import fn from './module1.js'//fn可以是任意变量名
console.log(fn())//输出“默认导出一个方法”
//我们可以将要导出的东西都放在默认导出中,
//然后取出来作为一个对象直接取里面的东西来用,比较方便

混合导出即同时在一个export中导出默认数据与非默认数据,加个逗号就能实现

//模块
export default function(){
    return "默认导出一个方法"
}
export let name ="aays";
//外部
import fn,{name} from "./module1.js";
console.log(fn()+name);//默认导出一个方法aays

4. 重命名export和import

如果导入的多个文件中,变量名字相同,即会产生命名冲突的问题,为了解决该问题,ES6为提供了重命名的方法,当你在导入名称时可以这样做:

export let myName="我来自module1.js";//模块1中
export let myName="我来自module2.js";//模块2中
//外部
import {myName as name1} from "./module1.js";
import {myName as name2} from "./module2.js";
console.log(name1);//我来自module1.js
console.log(name2);//我来自module2.js

三、ES6 之前如何实现模块

es6之前,js并没有模块。随着代码复杂度提升,开发者们为了应对难以维护的代码而考虑使用js现有的特性去实现模块化。

模块要求:

  1. 隐藏内部实现
  2. 提供调用接口

函数内部的变量是私有对外不可见的,借用该特点可以实现隐藏内部实现的需要。

function ff(){
  var a=123;
  var b="abcdef";
}
console.log(a)//错误,a未定义

在这里插入图片描述
利用函数的返回对象,通过 函数闭包特性(第五小节介绍) ,实现对内部数据对访问,间接实现了调用接口。
通过该接口,我们可以方便的使用模块内的功能,例如ffobj.f0();

// 闭包函数
function ff(){
  var a=123;
  var b="abcdef";
  var f0 = function(){
      console.log("a is :"+a);
  }

  return {a:a,b:b,f0:f0}
}

var ffobj = ff();

ffobj.f0()

在这里插入图片描述
简化定义与调用步骤,直接改为立即执行函数即可

const ffobj1 = function(){
  var a=123;
  var b="abcdef";
  var f0 = function(){
      console.log("a is :"+a);
  }

  return {a:a,b:b,f0:f0}
}();

在这里插入图片描述

四、commonjs的模块化

mathUtils.js

function add(num1, num2) {
  return num1 + num2
}

function mul(num1, num2) {
  return num1 * num2
}

module.exports = {
  add,
  mul
}

main.js 使用commonjs的模块化 导入 info.js

// 1.使用commonjs的模块化规范
const {add, mul} = require('./mathUtils.js')

console.log(add(20, 30));
console.log(mul(20, 30));

五、函数闭包

1. 定义:

闭包函数声明在一个函数中的函数,叫做闭包函数。
闭包:内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。

2. 解析:

闭包就是能够读取其他函数内部变量的函数。

3. 特点:

  1. 闭包外层是一个函数。
  2. 闭包内部都有函数。
  3. 闭包会return内部函数。
  4. 闭包返回的函数内部不能有return(因为这样就真的结束了)。
  5. 执行闭包后,闭包内部变量会存在,而闭包内部函数的内部变量不会存在。

4. 优点:

( 1 ) 可以有私变量的存在;
( 2 ) 避免全局变量的污染;
( 3 ) 希望一个变量长期驻扎在内存中,防止私有变量被垃圾回收机制所清除;

5. 缺点:

( 1 ) 闭包比普通函数占用更多的内存,会造成内存泄漏;在不使用时,要及时释放,将引用内层函数对象的变量赋值为null。

相关文章
|
2月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
243 1
|
3月前
|
移动开发 前端开发 JavaScript
Vue与React两大前端框架的主要差异点
以上就是Vue和React的主要差异点,希望对你有所帮助。在选择使用哪一个框架时,需要根据项目的具体需求和团队的技术栈来决定。
269 83
|
2月前
|
JavaScript 前端开发 编译器
Vue与TypeScript:如何实现更强大的前端开发
Vue.js 以其简洁的语法和灵活的架构在前端开发中广受欢迎,而 TypeScript 作为一种静态类型语言,为 JavaScript 提供了强大的类型系统和编译时检查。将 Vue.js 与 TypeScript 结合使用,不仅可以提升代码的可维护性和可扩展性,还能减少运行时错误,提高开发效率。本文将介绍如何在 Vue.js 项目中使用 TypeScript,并通过一些代码示例展示其强大功能。
126 22
|
9月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
147 0
|
4月前
|
人工智能 JavaScript 前端开发
Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
Vue在处理少量数据和有限dom的情况下技术已经非常成熟了,但现在随着AI时代的到来,海量数据场景会越来越多,Vue优化技巧也是必备技能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
6月前
|
Dart 前端开发 架构师
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
349 26
|
8月前
|
JavaScript 前端开发 搜索推荐
Vue的数据驱动视图与其他前端框架的数据驱动方式有何不同?
总的来说,Vue 的数据驱动视图在诸多方面展现出独特的优势,其与其他前端框架的数据驱动方式的不同之处主要体现在绑定方式、性能表现、触发机制、组件化结合、灵活性、语法表达以及与后端数据交互等方面。这些差异使得 Vue 在前端开发领域具有独特的地位和价值。
171 58
|
6月前
|
JavaScript 前端开发 jenkins
抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
本文探讨了在不依赖Node和VSCode的情况下,仅使用记事本和浏览器开发一个完整的Vue3前端项目的方法。通过CDN引入Vue、Vue Router、Element-UI等库,直接编写HTML文件实现页面功能,展示了前端开发的本质是生成HTML。虽然日常开发离不开现代工具,但掌握这种基础方法有助于快速实现想法或应对特殊环境限制。文章还介绍了如何用Node简单部署HTML文件到服务器,提供了一种高效、轻量的开发思路。
132 10
|
8月前
|
前端开发 开发者 C++
独家揭秘:前端大牛们如何高效学习新技术,保持竞争力!
【10月更文挑战第31天】前端技术飞速发展,如何高效学习新技术成为关键。本文通过对比普通开发者与大牛们的策略,揭示了高效学习的秘诀:明确目标、主动探索、系统资源、实践应用和持续学习。通过这些方法,大牛们能更好地掌握新技术,保持竞争力。示例代码展示了如何通过实践加深理解。
169 4
|
8月前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】React与Vue:前端框架的巅峰对决与选择策略