在ES6之前,官方没有出来import export这种模块化的语法。

为了提高代码复用、避免污染全局,民间写了很多模块化的实现:

1. 立即执行函数

(function(globalVariable){
globalVariable.test = function() {}
// ... 声明各种变量、函数都不会污染全局作用域
})(globalVariable)

2. AMD和CMD

这个我在很久之前就写过博文:js模块化的两种规范AMD和CMD

// AMD
define(['./a', './b'], function(a, b) {
// 加载模块完毕可以使用
a.do()
b.do()
})
// CMD
define(function(require, exports, module) {
// 加载模块
// 可以把 require 写在函数体的任意地方实现延迟加载
var a = require('./a')
a.doSomething()
})

3. CommonJs

这个是NodeJs出的模块化标准,直到现在还是很多人使用。

const mod = require('./mod.js');

module.exports = {mod};
exports.test = 123;

它的原理也很简单,就是每个模块文件都会包一层函数,然后最后加一条return module.exports,require的时候相当于执行这个函数

4. ES6 官方的 import export

这个具体用法我也写过一篇博文:ES6 import、export的写法

import mod from './mod.js'

let haha = '123'
if (mod.a === 1) {
const name = 'mod2';
import(`./${name}.js`).then(mod2 => {
    // 拿到 mod2 的东西
  })
} export {
mod,
haha as default
}

这里说一下还在社区比较活跃的CommonJs和ES Module的区别吧

1. CommonJs的require是同步加载的,而 ES Module的 import ‘xxx’ from 可能是异步也可能是同步(推荐阅读:https://segmentfault.com/q/1010000005680390

2. 都支持动态加载(就是支持在if语句里面加载,加载的目标可以是动态拼接的),CommonJs直接用 require() 同步,ES Module用 import() 异步

3. CommonJs是值拷贝,而 ES Module 是指向同一个内存,对象类型的当然都是一样,共用一块内存,但是普通类型CommonJs是普通的复制,而 ES Module 也是共用内存

js的模块化之路的更多相关文章

  1. 引用的时候js不能使用虚拟路劲,调试时用排除法测试

    今天碰到2个问题,搞了半天都没明白,又不报错: 就是js的问题:-->我返回了一个json,返回的json是正确的,但是view页面接受不到这个虚拟对象. 完全懵了,不知道为什么view页面接受 ...

  2. App 组件化/模块化之路——如何封装网络请求框架

    App 组件化/模块化之路——如何封装网络请求框架 在 App 开发中网络请求是每个开发者必备的开发库,也出现了许多优秀开源的网络请求库.例如 okhttp retrofit android-asyn ...

  3. App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南

    面对越来越复杂的 App 需求,Google 官方发布了Android 框架组件库(Android Architecture Components ).为开发者更好的开发 App 提供了非常好的样本. ...

  4. Android 组件化/模块化之路——在展示层搭建MVP结构

    Android 组件化/模块化之路——在展示层搭建MVP结构 什么是MVP Model–View–Presenter (MVP) 源于 Model–View–Controller (MVC) 的结构设 ...

  5. App 组件化/模块化之路——使用SDK的思路进行模块化设计接口

    在不久之前分享一篇<App 组件化/模块化之路——如何封装网络请求框架>文章介绍了我在项目中封装网络请求框架的思路.开发一个 App 会涉及到很多网络请求 API ,例如登录注册接口.用户 ...

  6. js的模块化规范

    js的模块化规范常见的有:AMD,CMD,commonJS,UMD,es6 前期在没有模块化的时候,js文件十分庞大,于是就按功能抽离划分为多个js文件. 但是在html页面通过script的方式加载 ...

  7. sea.js的模块化开发

    为什么使用sea.js? Sea.js 追求简单.自然的代码书写和组织方式,具有以下核心特性: 简单友好的模块定义规范:Sea.js 遵循 CMD 规范,可以像Node.js 一般书写模块代码. 自然 ...

  8. js前端模块化之加载器原理解析(一)

    先来说一下前端模块化的价值:引用模块此处有详细的介绍,可以自行前往观看. 一.总结如下优点: (1)解决命名冲突(2)烦琐的文件依赖(3)模块的版本管理(4)提高可维护性(5)前端性能优化(6)跨环境 ...

  9. js前端模块化(一) commonjs

    随着浏览器的发展,很多页面逻辑迁移到了客户端(表单验证等),JavaScript却没有为组织代码提供任何明显帮助,甚至没有类的概念,更不用说模块(module)了,JavaScript极其简单的代码组 ...

随机推荐

  1. sqlserver 转化函数

    --查询系统当前时间select GETDATE() as date;------------------------- 0-14 ------------------select CONVERT(V ...

  2. go的安装及环境变量设置

    1,go安装 https://studygolang.com/dl 官网下载,找自己需要的版本,傻瓜式安装 2.go的环境变量设置 windows下面要设置root和path root代表go安装路径 ...

  3. vue创建组件的几种方法

    <html> <head> <title>vue创建组件</title> <meta charset="utf-8"> ...

  4. ABAP-会计凭证替代字段GB01设置

    1.GB01表字段设置 SM30:VWTYGB01 找到需要替代的字段,设置bexclude勾选为空 2.运行程序 RGUGBR00 激活

  5. VSCode Git 没有活动的源代码控制提供程序

    主要原因:我以前安装的Git只允许在Git-Bash中运行,需要重新安装Git,选择允许三方软件的那个选项,然后安装Git插件,修改git.path即可. 以下是解决过程中的尝试,记录如下,实际上只需 ...

  6. nginx + php-fpm 搭建owncloud

    本文首发:https://www.cnblogs.com/somata/p/NgnixAndPhp-fpmBuildOwncloud.html 今天新研究的nginx,用owncloud来测试一下学的 ...

  7. Mysql安装与问题合集

    下载mysql https://dev.mysql.com/downloads/mysql/ 下载历史版本 看这篇文章 https://www.cnblogs.com/reyinever/p/8551 ...

  8. Warning | 3719 | 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.

    MySQL的“utf8”实际上不是真正的UTF-8.“utf8”只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节. MySQL一直没有修复这个bug,他们在2010年发布了一个叫作 ...

  9. 关于Mock的一些网站

    https://github.com/google/googletest/tree/master/googlemock https://blog.csdn.net/hhb200766/article/ ...

  10. centos6.5上安装git

    亲测有效 https://blog.csdn.net/wxy540843763/article/details/80197301