javascript 模块化 (切记:学习思想)

模块化(切记:学习思想)

如果不用模块化编写代码,那么会具有以下问题:

  • 代码杂乱无章,没有条理性,不便于维护,不便于复用
  • 很多代码重复、逻辑重复
  • 全局变量污染
  • 不方便保护私有数据(闭包)

模块化的基本实现:闭包的自调用函数

    //日期控件
    var DatePicker = (function(){
        return {
            init(){

            }
        }
    })();

    //Header
    //  tabbar
    //  login

    //Content
    //  sidebar
    //  table

    //Footer

    var KTV=(function(){
        return {
            pay(){

            },
            xiaofei(){

            }
        }
    })()

AMD模块化 -->requireJS

  • AMD:async module define:异步模块定义
  • AMD其实就是requireJS实现的模块化解决方案

其他模块化解决方案:

  • CommonJS:Node中使用的模块化解决方案
  • CMD(common module define):seajs中提出来的模块化解决方案
    • 其实CMD可以认为是CommonJS的前端实现
    • seajs由阿里的(玉帛)编写
    • seajs在2,3年前比较火,从去年开始已经停止更新
      • vue 、angular、react已经集成了各自的模块化
      • es6模块化
      • webpack也有模块化的解决方案

vue、angular、react已经将模块化的思想植入在里面

AMD和CMD的不同之处:

  • amd需要依赖前置,cmd需要依赖就近
  • 导入导出方式不同:
    • amd通过define定义,return导出;
    • cmd通过不需要定义,只需要最后通过module.exports、exports导出

requireJS —— AMD规范

中文网:http://www.requirejs.cn/docs/api.html#jsfiles

基本用法

    //1、通过script标签导入requirejs源文件
    //2、编写模块文件,基本格式如下:
    //cart.js
    define([],function(){
        console.log(‘cart模块‘);
    })
    //product.js
    define([],function(){
        console.log(‘product模块‘);
    })
    //3、首页调用模块:
    require(["cart.js","product.js"],function(){
        //编写后面的逻辑代码
    })
    //等价于:
    require(["cart","product"],function(){

    })

入口文件

配置

    require.config({
        //baseUrl
        //paths

    })

定义模块的返回值(返回值相当于模块的入口)

    //cart.js:
    define([],function(){

        return {
            init(){

            },
            addProduct(){

            }
        }
    })

    //首页:
    require(["cart"],function(cart){
        cart.init();
        cart.addProduct();
    })
  • 注意:一般在导入模块的时候,需要将有返回值的模块[前面]导入,无返回值的模块[后面]导入

案例——模块依赖子模块

    //productAdd.js
    define([],function(){
        return {
            init(){
                console.log("添加商品");
            }
        }
    })

    //productEdit.js
    define([],function(){
        return {
            init(){
                console.log("编辑商品");
            }
        }
    })

    //product.js
    define(["productAdd","productEdit"],function(productAdd,productEdit){
        return {
            init(){
                console.log("商品列表");
            },
            add(){
                productAdd.init();
            },
            edit(){
                productEdit.init();
            }
        }
    })

    //首页:
    require(["product"],function(product){
        product.init();

        product.add();

        product.edit();

    })

检测第三方库是否支持AMD规范

    if ( typeof define === "function" && define.amd ) {
        define([], function() {
            return jQuery;
        } );
    }
  • 类似的还有:echarts

常用的模块、文件夹路径的配置

  • 一般用于配置第三方模块,比如jquery、bootstrap、zepto等等

      require.config(
          paths:{
              jquery:"js/lib/jquery-1.11.min",
              zepto:"js/lib/zepto.min",
              bootstrap:"assets/bootstrap/js/bootstrap.min"
          }
      )
    
      define(["jquery","zepto"],function($,$$){
    
      })
    
      require(["jquery","bootstrap"],function($){
    
      })

插件

  • 插件列表:https://github.com/requirejs/requirejs/wiki/Plugins
  • i18n 国际化
  • text 加载文件(.html文件。。。)

requirejs和vuejs浅显的比较

  • requirejs是一个库

    • 相当于:一个房间
    • 相当于:一个底盘
    • 功能:只是一种模块化的解决方案
  • vue是一个框架
    • 相当于:一栋楼
    • 功能:1、不仅仅是模块化的解决方案
    • 2、减少了DOM的操作(-->jquery的功能)
    • 3、。。。。。。

requirejs解决循环依赖

  • a已经依赖了b
  • b中先添加require模块的依赖,然后再添加a的依赖,但是并不要去通过回调函数的形参获取返回值
    • define(["require","a"],function(require){})
    • 在需要执行a模块代码的时候,require("a")()

node中的模块化

  • require("http").createServer()
  • require("fs").readFile()
  • require("common/type").doSth()

前端路由的意义

  • 1、通过路由将各个功能从url上面就分辨出来了

    • /user/list
    • /user/3
    • /user/edit/3
  • 2、路由还可以进行前进、后退等导航操作

前端路由的实现方式

  • 1、监听window对象的hashchange事件

    • hash值:通过location.hash获取,获取的值以#开头
    • 也可以通过location.hash来设置hash值,当然设置的新hash也应该以#开头
  • 2、history对象:popState/pushState

ES6模块化

浏览器调试

    <script type="module">
        //导入模块
    </script>

基本用法

    //cart.js
    export default {
        name:"张三",
        age:18
    }

    //index.js
    import cart from "./cart.js"
    cart.name
    cart.age

导出模块

    //cart.js
    export const age = 18;
    export function f1(){
        console.log("f1函数");
    }
    //默认返回值
    export default {
        init(){
            console.log("初始化");
        }
    }

    //index.js
    import cart,{ age,f1 } from "./cart.js"
    cart.init();
    age,
    f1();

导入模块

    //index.js
    import cart as cartIndex from "./cart.js"
    import { age as AGE } from "./product.js"

    //使用变量:cartIndex
    //使用变量:AGE

原文地址:https://www.cnblogs.com/lguow/p/11428412.html

时间: 2024-10-14 02:35:36

javascript 模块化 (切记:学习思想)的相关文章

该如何理解AMD ,CMD,CommonJS规范--javascript模块化加载学习总结

是一篇关于javascript模块化AMD,CMD,CommonJS的学习总结,作为记录也给同样对三种方式有疑问的童鞋们,有不对或者偏差之处,望各位大神指出,不胜感激. 本篇默认读者大概知道require,seajs的用法(AMD,CMD用法),所以没有加入使用语法. 1.为何而生: 这三个规范都是为javascript模块化加载而生的,都是在用到或者预计要用到某些模块时候加载该模块,使得大量的系统巨大的庞杂的代码得以很好的组织和管理.模块化使得我们在使用和管理代码的时候不那么混乱,而且也方便了

实现一个JavaScript模块化加载器

对任何程序,都存在一个规模的问题,起初我们使用函数来组织不同的模块,但是随着应用规模的不断变大,简单的重构函数并不能顺利的解决问题.尤其对JavaScript程序而言,模块化有助于解决我们在前端开发中面临的越来越复杂的需求. 为什么需要模块化 对开发者而言,有很多理由去将程序拆分为小的代码块.这种模块拆分的过程有助于开发者更清晰的阅读和编写代码,并且能够让编程的过程更多的集中在模块的功能实现上,和算法一样,分而治之的思想有助于提高编程生产率. 在本文中,我们将集中讨论JavaScript的模块化

Javascript模块化开发-轻巧自制

Javascript模块化开发-轻巧自制 一.前言现在javascript的流行,前端的代码越来越复杂,所以我们需要软件工程的思想来开发前端.模块化是必不可少的,这样不仅能够提高代码的可维护性.可扩展性以及鲁棒性,更大的好处就是能够提升整个团队的开发效率,也能够让新进的程序员更快的接手工作.今天晚上根据前辈们的经验,写啦一个简单的模块定义的封装组件,当是练手吧.不过感觉还是蛮好用的.二.学习模块化前我们应该先了解点什么呢?其实突然就学习模块化的javascript开发,那还是比较丈二和尚,摸不着

JavaScript模块化-require.js,r.js和打包发布

在JavaScript模块化和闭包和JavaScript-Module-Pattern-In-Depth这两篇文章中,提到了模块化的基本思想,但是在实际项目中模块化和项目人员的分工,组建化开发,打包发布,性能优化,工程化管理都有密切的关系,这么重要的事情,在JavaScript大行其道的今天,不可能没有成熟的解决方案,所以从我的实践经验出发,从模块化讲到工程化,分享一下自己的经验. 这篇文章主要是讲require.js和r.js在项目中的使用,不会涉及到工程化问题,对此熟悉的看官可以略过此文.对

Javascript模块化编程(二):AMD规范

作者: 阮一峰 日期: 2012年10月30日 这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了. 目前,通行的Javascript模块规范共有两种

Javascript模块化编程(一):模块的写法

作者: 阮一峰 日期: 2012年10月26日 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑. Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,它不支持"类&qu

javascript模块化编程(1):为什么要用模块化编程

最近想边学边整一下模块化编程,那么先从为何要使用模块化编程说起吧,可能你刚听说模块化编程,也没有关系,本篇讲的是很基础的东西. 一开始写代码的时候,我们可能只需要一个js文件,去实现一个很小的功能,比如下面这样: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <

治愈 JavaScript 疲态的学习计划

显然,这篇文章触及了大家的神经:我一而再地在 Hacker News 看到它位居榜首.这也是 Reddit 网站里 javaScript 分类下最为热门的帖子,截至目前,在 Medium 上已有超过一万的喜欢数,很可能比我所有的文章加起来的喜欢数都多.但谁说了算呢? 尽管这并不意外,我很早之前就知道 JavaScript 生态系统会是混乱的.事实上,我进行这个< State Of JavaScript >调查的特殊原因就是要找出哪些库是实实在在受欢迎的,并且从喧闹声中整理出分类. 但是今天,我

JavaScript高级程序设计学习笔记--面向对象程序设计

工厂模式 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用 工厂模式的一种变体. function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var