资讯专栏INFORMATION COLUMN

前端要给力 — 平凡之路

WelliJhon / 3232人阅读

摘要:平凡之路前端发展了十几年,现在几乎到达顶峰的速度了,近两年推出的框架层出不穷,早已不是一统江湖了。模板和数据分离也好,状态和表现分离也好,我越来越体会到分是为了合这条平凡之路,还会频繁的发展和融合下去。

一直想总结下自己摸打滚爬的前端经历,3年,从一个极讨厌前端的人,变成一个吃前端饭碗的人。没有人带过我,跌跌撞撞的缓慢前进,但我很喜欢分享,喜欢一起进步,这会是我以后一直乐意做的事情。

综述 娃娃学步

w3cschool上的 html / css / javascript / 以及jquery教程,万事开头的第一步

Say hello to the world!

小跑上路

jquery 轻松玩耍DOM和event

jquery-ui 增强的UI组件

Bootstrap 从此傻瓜式排版就能搞定

Bootstrap 主题模板 and 管理系统模板 快速搭建项目,简单,好看

遇上平衡木

在小跑上路的过程中,做出来的东西看起来很专业,注意是“看起来”。如果不理解真正的前端技能,那只能是看起来专业,内部结构还是乱糟糟的,或者是遇到bug不知道怎么调,东一句西一句,拆了东墙补西墙。这过程就像走在平衡木上,稍不留神就会摔下去。

首先要了解css的布局原理

盒模型

定位模型

有了布局的基本理论后,尝试去理解Boostrap里的栅格系统 row col span2 背后的style

js最重要的三点: 闭包、原型、作用域

JS中的闭包及使用场合

使用闭包解决循环引用问题

闭包、原型、作用域 面试整理

关于js的原型和作用域,我没专门写过文章,建议去博客园搜下。如果想要完整的理解js语言机制,可以去看《Javascript模式》这本书,或者看我整理的读书笔记

《JavaScript模式》读书笔记系列

华丽跳跃谢幕

只有把平衡木上的技能磨熟练后,我们才能真正的游刃有余,保证不从平衡木上摔下来的前提下,再有余力去设计如何华丽的跳跃和谢幕。

组件封装

还没了解js对类(或模块)的封装前,我们的代码可能是这样的

var getData = function(){
    // ......
};

function editFunc(){
    // ......
};

$(".refresh-btn").on("click", function(){
    var data = getData();
    var $target = $($(this).attr("data-target"));
    $target.empty();

    for(var i=0; i");
        $child.append("" + data[i]["name"] + "");
        // ......
        $child.append("编辑");
        $target.append($child);
    }

    $target.find(".edit-link").on("click", editFunc);
});

一个点击就获取数据,然后刷新表格的功能。如果一个页面中有多个类似的异步刷新的表格,且每个表格的字段又各不相同,那么最偷懒的做法就是拷贝大段代码,然后再调整的字段。这样的代码简直了,太难维护了!

var table1 = new AjaxTable({
    el: "#dataTable",
    dataUrl: "/path/to/action/"
});

table1.refresh();

如果代码变成这样,那就爽多了,获取数据和刷新表格的过程都封在了AjaxTable中,各个使用之处只需要传个参数调用下refresh()即可,减少了大量重复(相似的)代码。这就是对UI组件/功能组件的封装。

以前为了准备面试时的“手撕代码”,写过一个简单的轮播组件,不用jquery(面试经常不允许使用任何库)

原生js的Slider组件

还写过下面一些文章

自己写的jquery分页插件

为Highcharts做包装 (有点类似上面示例中的AjaxTable

一步步做组件-学校选择器(系列) (系列长文,如何把一段生硬实现的代码一步一步封装和扩展成为一个可配置的UI组件)

模块化开发

如果要在页面上引入外部的js库,最初学习的时候是这样引入的





由于浏览器中js的执行(非加载)过程是在单线程中的,而各js文件又会存在依赖关系,比如 jquery-ui 依赖 jquery,bootstrap 也依赖 jquery,所以

我们可以把这一段作为一个base的父页面,命名为base.html,每个“具体业务”的页面都继承自它。

%{ extends "base.html" }%

%{ block styles }%

%{ endblock }%

%{ block content }%
具体业务...
%{ endblock }% %{ block scripts }%

上面相当于一个业务页面,它由sectionAsectionB两个页面组件组成,sectionA.tplsectionB.tpl是html模板。在应用层(即业务)页面中初始化两个js模块AB,并且把自身的App变量传递给模块(new Module(App)),可以实现子模块与应用层页面的通信,甚至是模块之间的通信。

这样把页面拆成粒度更细的结构,好处是页面模块可以复用,也便于管理,改动页面中的一小块时只需在所处的模块中,缩小改动的影响范围。

还看过一种思想是,把css文件也当做资源由requireJS动态加载,这样上面示例中的include xxx.css都不需要了,页面模块的css资源作为该模块的依赖,写在js模块的define的依赖中。

define(["jquery", "sectionA.css"], function($){
    // 业务模块...
});

这样把css和js都抽象成“资源”,相当于

组件 = 模板 + 资源

一个页面整体的模板,相当于多个页面组件的拼装而成。更进一步,如果能让页面组件做到异步渲染的话(即可以由js去解析模板语法和变量,而不是交给web框架),才能真正做到页面渲染的本质:

呈现给用户的页面 = 页面模板 (包括组件的模板) + 数据

“渲染”就是将带数据变量的页面模板输出成标准的html,同步渲染是指在服务端解析模板并输出完整html到浏览器中,而异步渲染指直接在浏览器中通过javascript 根据传入的数据将模板输出成标准html。

同一模板如果既能在服务端同步渲染,又能在浏览器端异步渲染的话,我们就不需要关心“数据”是后端框架直接输出到页面的,还是ajax动态取来的。对模板来说,数据就是个“接口”,而 模板 + 数据 = 渲染。这样我们作为前端,才能把更多精力放在模板和交互上,不用管数据的传递方式。

平凡之路

前端发展了十几年,现在几乎到达顶峰的速度了,近两年推出的框架层出不穷,jquery早已不是一统江湖了。每个人的精力都有限,不可能一个个都学过来,但是必须承认,前端是一个完整的体系(我之前整理的知识体系),有它独特和魅力之处。不仅是框架,还有更多的工程化问题,框架都是为了解决某类相通的问题而生。模板和数据分离也好,“状态”和“表现”分离也好,我越来越体会到

“分”是为了“合”

这条平凡之路,还会“频繁”的发展和融合下去。

本文最早发表在我的个人博客上,转载请保留出处 http://jsorz.cn/blog/2015/12/twisted-way-to-awesome-fe.html

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78614.html

相关文章

  • 4.平凡之路-封装帮助类和加载属性文件

    摘要:文件知识点修饰类不能被基础修饰方法不能被重写修改变量常量不允许进行实例化静态代码块只是加载一次加载核心配置文件失败图解说明加载属性文件新建的根目录下修改核心配置文件加载属性文件配置数据库的环境事务管理器保证数据的完整性 MyBatisUtils.java 文件 /** * 知识点: * final 修饰类 : 不能被基础 * 修饰方法 : 不能被重写 * 修改变量 : 常量 ...

    snifes 评论0 收藏0
  • 3.平凡之路-传统模式添加操作

    摘要:回顾上节课我们完成了的环境搭建核心配置文件映射文件的执行过程如何执行定制的语句我们测试的是死的数据那么下面我们使用容器传递动态的数据添加操作传递数据专题通过传递数据映射文件代码传递参数数据的类型或者提供额内置类型映射中的获取对应的值 回顾: 上节课我们完成了MyBatis的环境搭建核心配置文件映射文件API的执行过程如何执行定制的SQL语句 我们测试的是死的数据,那么下面我们使用容器传...

    cucumber 评论0 收藏0
  • 5.平凡之路-查询结果集简单处理

    摘要:说在前面的话命名空间暂时约定持久化类实体的类名的全路径一简单查询结果集处理查询结果集处理为类型字段作为中的值映射文件命名空间唯一的不能重复结果集处理后变成类型当你传递的是一个简单的数据类型的形参的时候那么你的值 说在前面的话 : 命名空间暂时约定-持久化类(实体Bean)的类名的全路径 com.shxt.model.Skill 一 简单查询结果集处理 1.查询结果集处理为Map类型 ...

    lowett 评论0 收藏0
  • 6.平凡之路-单条件模糊查询

    摘要:并且如果使用那么必须要指明值使用简单的数据类型不好使使用接口代理模式的注解也可以 属于MyBatis的核心之一,这里面的坑比较多,大家多多看看吧 一 模糊查询的三种方式介绍 我会使用resultMap处理结果集数据 1.死数据的模糊查询 映射文件 SELECT * FROM...

    tuantuan 评论0 收藏0

发表评论

0条评论

WelliJhon

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<