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

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

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

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

    //日期控件
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

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

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

    是一篇关于javascript模块化AMD,CMD,CommonJS的学习总结,作为记录也给同样对三种方式有疑问的童鞋们,有不对或者偏差之处,望各位大神指出,不胜感激. 本篇默认读者大概知道requi ...

  2. JavaScript模块化思想之入门篇

    在写正文之前先写一点废话,从我大三下学期正式接触前端到现在,已经六个月了.自己从HTML,CSS,简单的JS验证开始,一点点开始走入前端的世界.越发的感觉前端这一领域散发着无穷的魅力,也许这和我真心喜 ...

  3. Javascript模块化编程(一):模块的写法 (转载 学习中。。。。)

    转载地址:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 阮一峰 大神:http://www.ruanyifeng.com/ ...

  4. javascript模块化编程思想、实现与规范

    随着BS架构的发展,网站逐渐变成了互联网应用程序,嵌入网络的JavaScript代码越来越庞大,越来越复杂(业务逻辑处理或用户交互很多写在前端).网页越来越像桌面程序,需要一个团队分工协作.进度管理. ...

  5. Javascript模块化开发-轻巧自制

    Javascript模块化开发-轻巧自制 一.前言现在javascript的流行,前端的代码越来越复杂,所以我们需要软件工程的思想来开发前端.模块化是必不可少的,这样不仅能够提高代码的可维护性.可扩展 ...

  6. 实现一个JavaScript模块化加载器

    对任何程序,都存在一个规模的问题,起初我们使用函数来组织不同的模块,但是随着应用规模的不断变大,简单的重构函数并不能顺利的解决问题.尤其对JavaScript程序而言,模块化有助于解决我们在前端开发中 ...

  7. JavaScript模块化开发&&模块规范

    在做项目的过程中通常会有一些可复用的通用性功能,之前的做法是把这个功能抽取出来独立为一个函数统一放到commonFunctions.js里面(捂脸),实现类似于snippets的代码片段收集. fun ...

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

    在JavaScript模块化和闭包和JavaScript-Module-Pattern-In-Depth这两篇文章中,提到了模块化的基本思想,但是在实际项目中模块化和项目人员的分工,组建化开发,打包发 ...

  9. NNVM打造模块化深度学习系统(转)

    [摘录理由]: 之所以摘录本文,主要原因是:该文配有开源代码(https://github.com/dmlc/nnvm):读者能够直接体会文中所述的意义,便于立刻展开研究. MXNet专栏 :NNVM ...

随机推荐

  1. Java之字符编码和字符集

    什么是字符编码 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字.英文.标点符号.汉字等字符是二进制数转换之后的结果.按照某种规则,将字符存储到计算机中,称为编码 .反之,将存储在计算 ...

  2. [译]Vulkan教程(23)暂存buffer

    [译]Vulkan教程(23)暂存buffer Staging buffer 暂存buffer Introduction 入门 The vertex buffer we have right now ...

  3. vuex的学习

    vuex是什么? vuex是专为vue.js应用程序开发的状态管理模式 它采用集中式存储管理应用所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化 vuex也集成到vue的官方调式工具d ...

  4. Linux下shell脚本实现mongodb定时自动备份

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功 ...

  5. IT兄弟连 HTML5教程 CSS3揭秘 CSS3属性2

    3  背景属性 在CSS3中提供了多个背景属性,这里只介绍两个比较常用的属性,其他属性可以从手册中获取帮助.在CSS3中,通过background-image或者background属性可以为一个容器 ...

  6. 巧妙利用label标签实现input file上传文件自定义样式

    提到上传文件,一般会想到用input file属性来实现,简单便捷,一行代码即可    但input file原生提供的默认样式大多情况下都不符合需求,且在不同浏览器上呈现的样式也不尽相同   我们往 ...

  7. ETCD:多机上的集群

    原文地址:cluster on multiple machines 总览 启动一个集群静态的要求是每一个集群中的成员需要知道其他成员的位置.在许多情况下,集群成员的IP可能无法提前知道.在这种情况下, ...

  8. #w30 2019年大前端技术周刊

    本周是2019年第30周 会议 2019年ArchSummit全球架构师峰会 2019年7月在深圳举行了ArchSummit全球架构师峰会,里面有不少关于大前端的主题可以关注. 从0到1,移动政务应用 ...

  9. 资深架构师教你String 常量池、 String.itern()

    什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Class文件中的常量池 在Class文件结 ...

  10. web渗透测试

    信息收集 网络搜索 目录遍历:site:域名 intitle:index.of 配置文件泄露:site:域名 ext:xml | ext:conf | ext:cnf | ext:reg | ext: ...