一、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. css摩天轮

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  2. AGC055

    AGC055 第一次打AGC,好难受. T1 看了一眼题解,没看懂--但是还是做出来了. T2 感觉比 T1 简单,构造很好猜. 其他的没时间思考,T1 花了我 2h30min,难受. A.ABC I ...

  3. .net core (.net6) 读取配置文件 appsettings.json

    .net core (.net6) 读取配置文件 appsettings.json 新建个工具类,方便其它地方使用,代码如下 AppHelper: namespace net6mvc.Utils { ...

  4. 图片预加载需要token认证的地址处理

    1.添加函数修改img的属性: /** * * @param {*} idName 传入的id,获取改img的dom,添加相应的数学 */ export const proxyImg = (idNam ...

  5. 为什么https要使用证书

    为什么https要使用证书 什么是httpshttps不是一种新的协议,只是http的通信接口部分使用了ssl和tsl协议替代,加入了加密.证书.完整性保护的功能. 加密:共享密钥加密加密和解密公用一 ...

  6. Vulnhub Mercy Walkthrough

    Recon 首先进行二层扫描. ┌──(kali㉿kali)-[~] └─$ sudo netdiscover -r 192.168.80.0/24 Currently scanning: Finis ...

  7. [ABC184F] Programming Contest题解

    前置知识 meet in middle (折半搜索) 会的大佬请跳过 不会的请自己前往oi wiki或CSDN(百度吧,少年) 解题思路 纯暴力 看完题目考虑将每一种情况计算出来,排序后找不超过T的最 ...

  8. 嵌入式ARM端测试手册——全志T3+Logos FPGA开发板(上)

    前 言 本指导文档适用开发环境: Windows开发环境:Windows 7 64bit.Windows 10 64bit Linux开发环境:Ubuntu18.04.4 64bit 虚拟机:VMwa ...

  9. 记一次aspnetcore发布部署流程初次使用k8s

    主题: aspnetcorewebapi项目,提交到gitlab,通过jenkins(gitlab的ci/cd)编译.发布.推送到k8s. 关于gitlab.jenkins.k8s安装,都是使用doc ...

  10. ubuntu16 python2 安装M2Crypto报错

    正文 pip2 install M2Crypto # 报错: # unable to execute 'swig': No such file or directory # error: comman ...