• Javascript中的模块化详解


    1.什么是模块化、模块化开发?

    • 事实上模块化开发最终的目的是将程序划分成一个个小的结构
    • 这个结构中编写属于自己的逻辑代码,有自己的作用域,不会影响到其他的结构;
    • 这个结构可以将自己希望暴露的变量、函数、对象等导出给其结构使用;
    • 也可以通过某种方式,导入另外结构中的变量、函数、对象等;
    上面说提到的 结构 ,就是 模块 ;按照这种 结构划分 开发程序的过程,就是 模块化开发 的过程;

    2.JavaScript模块化的历史

          在网页开发的早期, Brendan Eich 开发JavaScript仅仅作为一种 脚本语言 ,做一些简单的表单验证或动画实现等,那个时候代码还是很少的:
    • 这个时候我们只需要讲JavaScript代码写到
  • // 首先用config()指定各模块路径和引用名
  • require.config({
  • baseUrl: './src',
  • paths: {
  • foo: "foo", // 实际路径为./src/foo
  • bar: "bar"
  • }
  • })
  • // 引用模块的时候,我们将模块名放在[ ]中作为requier()的第一参数
  • require(["foo", "bar"], function(foo) {
  • console.log("main:", foo)
  • })
    1. // foo.js
    2. define(function() {
    3. const name = "why"
    4. const age = 18
    5. function sum(num1, num2) {
    6. return num1 + num2
    7. }
    8. return {
    9. name,
    10. age,
    11. sum
    12. }
    13. })
    如果我们定义的模块本身也依赖其他模块,那就需要将它们放在[ ]中作为define()的第一参数。
    1. // bar.js
    2. define(["foo"], function(foo) {
    3. console.log("bar:", foo)
    4. const name = "bar"
    5. return { name }
    6. })
    AMD 在依赖模块加载完成后就 直接执行依赖模块,依赖模块的执行顺序和我们书写的顺序不一定一致,并且即使在回调函数里面没有用到该模块,也会加载执行。
    1. define(["a", "b", "c", "d", "e", "f"], function(a, b, c, d, e, f) {
    2. // 等于在最前面声明并初始化了要用到的所有模块
    3. if (false) {
    4. // 即便没用到某个模块 b,但 b 还是提前执行了
    5. b.foo()
    6. }
    7. });

8.CMD

这种方案采用 异步加载的方式来加载模块, CMD 在依赖模块 加载完成后并不执行,只是下载而已,等到所有的依赖模块都加载好后,进入回调函数逻辑, 遇到 require 语句 的时候才执行对应的模块,这样模块的执行顺序就和我们书写的顺序保持一致了。
sea.js 实现了 CMD 规范。它和require.js的区别在于对依赖模块的执行时机的处理不同。
  1. // 定义模块 math.js
  2. define(function(require, exports, module) {
  3. var a = require('./a'); //遇到require语句时,才会执行对于模块的代码
  4. a.doSomething();
  5. if (false) {
  6. var b = require('./b'); // 该语句不会执行,所以./b对应的模块也不会执行
  7. b.doSomething();
  8. }
  9. let add = function(a,b){
  10. return a+b;
  11. }
  12. exports.add = add; // 导出add
  13. });
  1. // 加载模块
  2. seajs.use(['math.js'], function(math){
  3. var sum = math.add(1+2);
  4. });

参考:

一文了解js中导入模块import、import()和require()的区别 - 掘金 (juejin.cn)

  • 相关阅读:
    循环玩具游戏
    常用sql语句
    Ngnix封禁IP与ip段
    HTML5+css3课后习题【一】
    Matlab:Unicode 和 ASCII 值
    虚拟列表方案实现
    Scrapy08:scrapy-deltafetch,让爬虫有了记忆
    快速搭建开源分布式任务调度系统DolphinScheduler并远程访问
    双翌保养码使用指南方法三
    背包问题学习笔记-完全背包
  • 原文地址:https://blog.csdn.net/ICanWin_lll/article/details/133560109