我的网站开发技术经验总结 我的网站开发技术经验总结
首页

fangdown

我的网站开发技术经验总结
首页
  • 大前端

  • 基础

    • js

    • css

    • ES6

      • 说说对模块化的理解
        • 是什么
        • 怎么用
          • 为什么要模块化
          • 模糊化发展历程
          • 既然存在了AMD以及CommonJs机制,为什么还要ES6的Module呢
          • 使用
          • 动态加载
        • 原理
        • FAQ
      • 说说ES6中对象新增了哪些扩展
      • 说说ES6中函数新增了哪些扩展
      • ES6中数组的常用方法
      • 说说ES6中新增的Set、Map的区别
      • 说说ES6中Decorator的理解
      • 说说ES6中Generator的应用
      • 说说ES6中Promise的常用方法及原理
      • 说说ES6中Proxy的理解
      • 说说var、let、const之间的区别
  • 框架

  • 情商

  • 算法

  • 网络

  • 千锤百炼
  • 基础
  • ES6
fangdown
2021-08-02
目录

说说对模块化的理解

# 是什么

  • 将一个复杂的程序依据一定的规则(规范)封装成几个块(文件), 并进行组合在一起
  • 块的内部数据与实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信

# 特性

  • 对外联系接口
  • 内部功能

# 怎么用

# 为什么要模块化

  • 代码抽象
  • 代码封装
  • 代码复用
  • 依赖管理

没有模块化, 会怎样?

  • 变量和方法不容易维护, 容易全局污染
  • 加载js资源从上到下
  • 依赖不分
  • 大型项目难以维护

# 模糊化发展历程

IIFE AMD CMD CommonJs ESM

  1. AMD

代表为require.js

/** main.js 入口文件/主模块 **/
// 首先用config()指定各模块路径和引用名
require.config({
  baseUrl: "js/lib",
  paths: {
    "jquery": "jquery.min",  //实际路径为js/lib/jquery.min.js
    "underscore": "underscore.min",
  }
});
// 执行基本操作
require(["jquery","underscore"],function($,_){
  // some code here
});
  1. CommonJs(nodejs中常用)
// a.js
module.exports={ foo , bar}

// b.js
const { foo,bar } = require('./a.js')

# 既然存在了AMD以及CommonJs机制,为什么还要ES6的Module呢

ES6在语言的层面上,实现了Module, 完全可以取代CommonJs和AMD规范,成为浏览器和服务端通用的模块解决方案。(更牛逼点)

# 区别

  • CommonJs和AMD模块都只能在运行时确定执行东西
  • ES6设计思想就是尽量的静态化, 使得编译时就能确定模块的依赖关系,以及输入和输出的变量
  • CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用
  • CommonJS 模块是运行时加载,ES6 模块是编译时输出接口
  • ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。
// CommonJS模块
let { stat, exists, readfile } = require('fs');
// 等同于
let _fs = require('fs');
let stat = _fs.stat;
let exists = _fs.exists;
let readfile = _fs.readfile;
// ES6模块
// 只加载3个方法,其他方法不加载
import { stat, exists, readFile } from 'fs';

# 使用

  1. export
// test.js
export const name = 'fangdown'
export const foo = () => {}
export default foo 

  1. import
import {foo, name} from './test.js'
import * as Test from './test.js'
  • import会提升到整个模块的头部,首先执行
  • 多次重复执行同样的导入,只会执行一次

# 动态加载

允许您仅在需要时动态加载模块,而不必预先加载所有模块,这存在明显的性能优势

这个新功能允许您将import()作为函数调用,将其作为参数传递给模块的路径。它返回一个 promise,它用一个模块对象来实现,让你可以访问该对象的导出

import('/modules/test.mjs')
  .then((module) => {
    // Do something with the module.
  });

# 原理

# FAQ

#模块化
上次更新: 2021/12/19, 18:05:42
谈谈你对BFC的理解
说说ES6中对象新增了哪些扩展

← 谈谈你对BFC的理解 说说ES6中对象新增了哪些扩展→

最近更新
01
多分支修复撞车的问题
05-01
02
如何成为架构师
01-23
03
服务器部署全过程
11-23
更多文章>
Theme by Vdoing | Copyright © 2019-2026 fangdown | 粤ICP备19079809号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式