前端模块化、工程化

我的梦境 提交于 2020-01-04 02:48:36

  先谈谈前端工程化,web前端越来越像“应用程序”,处理的业务繁杂,需要用的html,css,js等文件越来越多;因此不得不用工程化的思想去组织管理这些文件;当然关于前端工程化在细节上见仁见智;以下是个人的理解:

  首先是业务需求文档的规范化;

  其次是开发过程中的管理:版本控制(git/svn),js模块化(AMD,CMD,ES6),MVVM框架(react,vue)等

  再其次是测试阶段:自动化测试js接口函数等(karma,mocha),数据mooc

  最后是打包部署:构建工具进行丑化、合并等

 

构建工具grunt && gulp

   Grunt 是最先流行起来的前端工程,其核心思想是基于配置的工作流模式,定义一个配置文件,声明工作流各个环节的相关配置,调用 grunt 就能完成打包编译;

   Gulp 几乎取缔 Grunt ,成为前端的默认流程工具,其核心思想是基于内存的流的方式,提供高效的性能,极简的 API,定义不同的 task,然后将 task 串联起来;

   Gulp入门教程

 

开发效率

   通常的前端开发过程是,修改前端代码,调用命令编译代码,然后浏览器 F5 刷新。这个过程可以做到自动化,通过代码监控工具,指定要监控的目录和文件,如果对应文件有改变,调用编译工具编译源码,然后通过 livereload 自动刷新浏览器;

 

数据mock

   现代化前端项目开发大多是前后端分离的方式,也就是后端基本是提供 API 服务,在真实开发环境中,通常的问题是,后端 API 极其不稳定或者没开发,为了不阻碍前端的开发,通常的做法是,前后端先约定 API 接口定义,然后前端根据定义 mock 接口。

  对于大公司来说,可能有 mock 平台来实现这一功能,但对于小公司小项目来说,可能只能自己实现,我们可以利用一些开源的数据 mock 工具来在前端工程中实现;

  mockjs官网

 

部署需求

   一个前端工程通常是多人维护的,所以会用代码管理工具(默认 git) 来管理源码,然后将开发流程和部署流程和 git 结合起来。

  1. 多人分支协作流程:用 git flow 来管理代码分支

  2. 代码自动发布:git hook

 

 

javascript的模块化历程 

  先简短介绍下js模块化演进史:

    1.问题困扰:JavaScript语言没有模块功能,在业务处理中经常需要模块化开发,模块化开发方便管理代码,能有效组功能;因此开启了漫长模块化之路;

    2.使用立即执行函数创建独立的命名空间;把一个立即执行函数看做一个模块,函数中的变量、方法是私有的;

    3.nodejs出现,推出commonjs规范了JavaScript在服务器端的模块化标准;commonjs只能同步加载模块;

    4.浏览器中的js文件需要从服务器端下载,只有异步加载模块的方式才不会造成阻塞,显然commonjs不适合,因此推出AMD规范,requirejs是浏览器端异步加载模块的工具;

    5.至此服务器端、浏览器端模块化规范都已出现;

    6.浏览器端由于AMD规范的requirejs自身问题(加载时需要先规定好依赖顺序等),产生了CMD规范的seajs(可以按需加载)

    7.ECMA组织推出ES6版本,其中定义了module关键字作为模块加载工具;

 

  commonjs && ( AMD && CMD )区别

    AMD写法:

define(['a.js','b.js','c.js','d.js','e.js'],function(a,b,c,d,e){
    // 缺点:
    // 1.需要事先写好依赖关系,如果依赖众多,在样式上难看
    // 2.定义的时候会预加载依赖,同时执行依赖文件(如果依赖众多,严重影响浏览器加载时间,而且有些依赖可能在触发某些事件后才会用到)
})

    CMD写法:

define(function(require,exports,module){
    var a = require('a.js');
    a.hello();

     var b = require('b.js');
     $('').click(function(){ b.hello(); });

     $('').click(function(){
            var c = require.async('c.js');
            c.hello();
      });
     // 1.预先加载require引入的文件,但不执行
     // 2.只有调用依赖中的函数时才执行依赖
     // 3.通过require.async(),可以做到懒加载,只有触发事件时才会加载c.js文件
})

 

 

 

参考:(优质的文档能够准确,快速地理解掌握知识点;感谢以下文档)

[1] JavaScript的模块化历程

[2] 前端工程化概述

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!