一、JS的演变:

1、简单的页面控制,改变HTML标签和CSS样式

2、AJAX异步请求,控制前后数据传输问题

3、更强大的功能,几乎依赖JS实现

工程管理问题:

简单页面只需要在页面嵌入script标签里面写JS即可完成业务功能的实现

继续向下复杂,JS不得不需要独立出来放入文件中加载实现

JS文件与日剧增,文件也不好管理,引申出模块化概念

实际上倒不如说是为了多人开发的解决方案

二、变量冲突问题

演示案例:

这里引入了三个JS文件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script type="text/javascript" src="devA.js"></script>
<script type="text/javascript" src="devB.js"></script>
<script type="text/javascript" src="devC.js"></script>
</body>
</html>

A文件:

// devA
var name = 'devA-name'
var age = 100 function sum(n1, n2) {
return n1 + n2;
} var flag = true; if (flag) {
console.log(sum(100,8));
}

B文件:

// devB
var name = 'devB-name'
var age = 23 function sum(n1, n2) {
return n1 + n2;
} var flag = false; if (flag) {
console.log(sum(20,8));
}

C文件引用这个变量进行判断

if (flag) {
console.log('flag is true');
}

打印结果:

三、演变与CommonJS

解决上述冲突的方案

var moduleA = (function() { /* 3、 利用这个匿名函数将对象赋值给变量ModuleA  */
// devA
var name = 'devA-name'
var age = 100 function sum(n1, n2) {
return n1 + n2;
} var flag = true; if (flag) {
console.log(sum(100,8));
} /* 1、 利用JS对象把上述的属性和函数装载 */
var object = {};
object.flag = flag;
object.sum = sum; console.log(object); return object; // 2、 把这个对象用匿名函数返回
})();
/* 这样全局对象就存放了一个moduleA变量 */

devC文件调用时这样编写:

if (moduleA.flag) {
console.log('flag is true');
}

我们模块化之后只需要保证模块对象的变量名称不发生冲突且规范即可

上述的解决方案体现出了模块化的核心概念

那就是导入和导出【Import & Export】

常见的模块化规范:

CommonJS
AMD
CMD
ES6 Modules

1、CommonJS

规范使用语法:

CommonJSexport.js 导出

module.exports = {
flag : true,
sum : function () {
// todo ...
},
}

module.exports是不存在的变量,所以需要API支持

CommonJSimport.js 导入

【支持.js后缀省略】

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

上面的写法时使用解构函数

当然还是使用变量引用的方式舒服些

let customModule = require('./CommonJSexport');

四、ES6的模块化导入和导出

导出的JS文件:

var foo = 100;
var bar = function () {
// todo....
console.log('sss');
} /* 将此JS的变量导出 */
export {
foo, bar
}

导入的JS文件:

import { foo, bar } from './exportJavaScriptFile.js';
console.log(foo);
bar();

index.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="module" src="./exportJavaScriptFile.js"></script>
<script type="module" src="./importJavaScriptFile.js"></script>

</head>
<body>
</body>
</html>

注意上面的script标签一定要使用type属性标注module

否则关键字export和import都无效,浏览器无法解析识别

导出的语法:

/* 将此JS的变量导出 */
export {
foo, bar
} /* 导出方式二 */
export var varA = 100; /* 导出函数 */
export function fun1() {
// todo ...
return 100;
} /* 导出JS类 */
export class JsClass {
aaa;
bbb;
fun1() { }
fun2() { }
}

上述的导出在导入时必须使用解构函数,也就是在括号中调用变量名称即可

但是如果是使用导入的类的话,就需要这样使用了。。。

import { JsClass } from './exportJavaScriptFile.js';
let jsClass = new JsClass();
jsClass.aaa = 111;
// todo ....

当然我们也希望直接以对象的方式引用出来

可以这样:

// import { foo, bar } from './exportJavaScriptFile.js';
import * as aaa from './exportJavaScriptFile.js';
console.log(aaa.foo);
console.log(aaa.bar());

五、Export Default使用

我们不希望把导出的东西进行命名,命名的规则留给导入此模块的调用者去命名

所以有了export default

在上面的案例我们都发现,export之后,导入进来调用的使用者必须按照指定变量名称使用

如果调用者不知道变量名称将是个头疼的事情

但是要注意,export default只允许使用一次。

let foo = 213;
let bar = function (n1, n2) {
return n1 * n2;
} export default {
foo, bar
}

导入时:

可以自行定义导入模块的变量名称了

import mmm from './defaultExport';
console.log(mmm.foo);
console.log(mmm.bar(213, 332));

【Vue】Re08 模块化的更多相关文章

  1. Vue 路由模块化配置

    博客地址:https://ainyi.com/77 企业运营后台页面很多,路由如若不区分模块化配置,所有路由挤在同一个文件将不好维护,所以路由的配置也要模块化 分享两个解决方案 -- Vue 路由配置 ...

  2. Vue路由模块化的实现方法

    分享一个Vue路由模块化方法,简单实用,好用到飞起 路由模块化 1.router/index.js 配置路由 import Vue from 'vue' import VueRouter from ' ...

  3. 利用requirejs实现vue的模块化开发

    通常vue都是搭配webpack+vue-cli使用的 如果不在nodejs环境下开发web应用呢? 这里提出一个解决方案: 1.加载requirejs,并且指定main函数 <script d ...

  4. webpack+vue+vueRouter模块化构建完整项目实例详细步骤-入门篇

    新建项目 开始(确认已经安装node环境和npm包管理工具) 1.新建项目文件名为start_vuedemo 2.npm init -y 初始化项目,我的win7系统,工程在d盘的vue_test_p ...

  5. webpack+vue+vueRouter模块化构建小demo实例超详细步骤(附截图、代码、入门篇)

    说明:本demo使用yarn代替npm指令来下载一系列依赖,有详细指令说明:使用WebStorm下Terminal来输入指令: >开始(确认已经安装node环境和yarn包管理工具) 1.新建项 ...

  6. vue css 模块化编程 CSS Modules Scoped

    1.scoped https://vue-loader.vuejs.org/zh/guide/scoped-css.html 2.module https://vue-loader.vuejs.org ...

  7. .Net Core与Vue.js模块化前后端分离快速开发解决方案(NetModular)

    NetModular是什么? NetModular不仅仅是一个框架,它也是一整套的模块化与前后端分离的快速开发的解决方案,目标是致力于开箱即用,让开发人员完全专注于业务开发,不需要关心底层封装和实现. ...

  8. .Net Core+Vue.js模块化前后端分离快速开发框架NetModular更新日志(2019-12-08)

    源码 GitHub:https://github.com/iamoldli/NetModular 码云:https://gitee.com/laoli/NetModular 欢迎star~ 文档 ht ...

  9. vue 路由模块化

    第一. 在 router 文件夹下 新建个个模块的文件夹,存放对应的路由js文件 如图1: 第二.修改router文件夹下的index.js  如图2 三.在main.js 修改如下代码 图3

  10. vue中模块化后mapState的使用

    代码如下: 相当于声明了一个变量name,然后以state入参取得其modules文件夹中user文件里的name属性.因为在模块(如user)中,在抛出时的export default中添加了一句: ...

随机推荐

  1. c# 拖拽列表顺序 | 拖拽合并分组 | 移除分组功能

    动图演示: 背景: 一开始做功能的时候没有增加排序的索引(sort-index),后来要求做拖拽排序功能:所以写了这个不需要初始排序就可以完成的拖拽功能:如果是table表格排序逻辑和这个相似,这里拿 ...

  2. Spring Boot 使用 拦截器 实现 token 验证

    Spring Boot 使用 拦截器 实现 token 验证 整体思路:1.写一个工具类封装生成.校验和解析 token 的方法:2.在注册和登录时生成 token ,生成的 token 存入 red ...

  3. Idea SpringBoot 子模块 加载不到该子模块根目录config下面的配置文件

    Idea SpringBoot 子模块 加载不到该子模块根目录config下面的配置文件 import org.mybatis.spring.annotation.MapperScan; import ...

  4. spring与设计模式之三代理模式

    部分内容引用: https://blog.csdn.net/shulianghan/article/details/119798155 一.定义 1.1定义 对于现实生活中的代理,大家非常好理解.我们 ...

  5. k8s健康检查(探针Probe)之LivenessProbe、ReadinessProbe和StartupProbe

    背景 集群正常服务时,会出现容器死掉问题,如宿主机故障.资源不足.下游故障等.这个时候容器需要从endpoints摘除(容器挂了就不能接流了),并执行它的restart策略. LivenessProb ...

  6. Java面试知识点(二)super 和 this 关键字

    this this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this 的用法在 java 中大体可以分为 3 种: 普通的直接引用 这种就不用讲了,this 相当于是指向 ...

  7. Android 自定义带动画的柱状图

    功能分析 假设要使用柱状图展示用户一周的数据,通用的做法是对接三方图表SDK或者自己通过代码绘制. 1.三方SDK通常包体较大,且定制性差,对特定的UI需求兼容性差; 2.自己绘制,比较复杂,而且要考 ...

  8. NB-IoT,LoRA,WIFI,蓝牙,Zigbee,MQTT,CoAP之间的关系

    --- title: file_name date: 2020-06-22 07:26:20 categories: tags: - iot - wifi - Bluetooth - MQTT - c ...

  9. QuartzNet暂停恢复会执行多次的问题解决

    ' var config = new System.Collections.Specialized.NameValueCollection { { "quartz.jobStore.misf ...

  10. 搭建hadoop集群关键步骤--以三节点为例

    搭建三节点的hadoop集群: 要求: 主机名称 备注 IP地址 功能 hadoop01 Master 主节点 192.168.211.134 NameNode.DataNode.ResourceMa ...