资讯专栏INFORMATION COLUMN

webpack工具链热替换 -- angularjs的粗放式实现

Eminjannn / 3130人阅读

摘要:参照组件单一职责,单个模块文件仅承担有限职责,。路由声明与组件声明在统一文件内部声明。组件替换约定服务在内部属于单例,实例声明通过的方式,声明服务。指令热替换同样采用较为粗放的容器定位策略,通过路由模板替换实现。

ng-hot-loader 前言

webpack-dev-server自带支持模块热替换特性(HMR),不刷新页面实现代码局部更新,使用HMR可以大幅提升开发效率。

实现目标

[x] 样式热替换 -- style-loader本身即支持HMR,建议依赖库css直接解析出文件link,降低热替换成本

[x] 模板热替换

[x] 服务热替换

[x] 过滤器热替换 -- expression 变动才会重新实例化过滤器

[x] 指令热替换 -- 目前low level的支持

[x] 控制器热替换

实现策略

合理划分angular模块,将angular模块划分为主模块,业务模块。路由, 业务服务全局服务合理分散到主模块与业务模块中。参照angular组件单一职责,单个模块(文件)仅承担有限职责,。

HMR关键核心为组件声明 => 组件定位 => 组件更新

文件命名建议按照官方styleguide

关联filter, service, directive在单一模块中声明。

关键核心依旧在模块,路由声明。路由声明中,模板与控制器统一采用ES6引入方案,template: templateVariable,控制器声明统一采用pure function的方式,而不是字符串的方式。

路由声明与组件声明在*.module.js统一文件内部声明。

控制器暂时不考虑通过$controllerProvider注册的类型。

路由不考虑热更新。

所有模板文件,都通过ES6 default import导入,JS文件建议全部通过destruct的方式引用。

/**
 * @description - application level router config.
 * @author bornkiller 
 */

"use strict";

// layout module dependency
import layoutAuthorizeTemplate from "./authority/authorize.html";
import { AuthorizeController } from "./authority/authorize.controller";

import layoutNavbarTemplate from "./flow/navbar.html";
import layoutSidebarTemplate from "./flow/sidebar.html";
import layoutCoreTemplate from "./flow/core.html";
import { SidebarController } from "./flow/sidebar.controller";


// layout module name
const LAYOUT_MODULE = "app.layout";

// layout module router
const LayoutRoute = [
  {
    name: "authorize",
    url: "/authorize",
    views: {
      "core": {
        template: layoutAuthorizeTemplate,
        controller: AuthorizeController,
        controllerAs: "vm"
      }
    }
  },
  {
    name: "application",
    url: "/application",
    views: {
      "navbar": {
        template: layoutNavbarTemplate
      },
      "sidebar": {
        template: layoutSidebarTemplate,
        controller: SidebarController,
        controllerAs: "vm"
      },
      "core": {
        template: layoutCoreTemplate
      }
    }
  }
];

angular.module(LAYOUT_MODULE, [])
  // eslint-disable-next-line angular/di
  .config(["$stateProvider", function ($stateProvider) {
    LayoutRoute.forEach((route) => {
      $stateProvider.state(route);
    });
  }]);

export { LAYOUT_MODULE };
模块划分

通过划分模块实现最终目标:

ng-hot-analyzer - 分析组件的声明与定位,主要包括importregister token的分析。最终汇总,实现模块定位 <--> 模块导出实例 <--> NG组件注册的图谱。

ng-hot-loader - 汇聚子模块操作,基于分析结果与对应模板,生成对应HMR代码。

ng-hmr - 热更新具体实现。

组件替换约定

服务在angularjs内部属于单例,实例声明通过factory的方式,声明literal object服务。

过滤器仅支持ng-bind使用。

模板热替换目前采用较为粗放的容器定位策略,基于最近的ui-router view进行局部替换。

指令热替换同样采用较为粗放的容器定位策略,通过路由模板替换实现。

控制器统一使用ES6 Class声明,字段更新策略如下:

[x] 删除字段

[x] 依赖注入服务,直接override

[x] 函数字段,直接override

[x] 通过控制器内声明shouldFieldUpdate方法来精确控制对应字段是否更新。

[x] 如果控制器未声明shouldFieldUpdate方法,默认判定策略是类型变化,类型出现变化即直接override

HMR示例
if (module.hot) {
  module.hot.accept(["${descriptor.location}"], function () {
    ${translateImportType(descriptor)}
    $hmr.hmrOnChange("${capitalize(descriptor.category)}", "${descriptor.token}", ${descriptor.name});
    $hmr.hmrDoActive("${capitalize(descriptor.category)}", "${descriptor.token}", ${descriptor.name});
  });
};
项目实现

https://github.com/bornkiller...

https://github.com/bornkiller...

https://github.com/bornkiller...

https://github.com/bornkiller... 热替换DEMO

TODO

支持字符串声明控制器

调整模板scope定位方式

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

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

相关文章

  • 前端工程化工具初选

    摘要:面对日益纷杂的前端工具,作为新人常感无从下手。脚手架应用开发流程与工具项目生成器集成方案解决前端开发中自动化工具性能优化模块化框架开发规范代码部署开发流程等问题框架简洁直观强悍的框架,让开发更迅速后端程序的福音。   面对日益纷杂的前端工具,作为新人常感无从下手。经过一番检索和简单对比,再结合自己的喜好,筛选了将要学习和使用的工具,以适应日益工程化、专业化的 Web 前端开发工作。 s...

    Rocture 评论0 收藏0
  • 前端面试题(3)现代技术

    摘要:什么是单页面应用单页面应用是指用户在浏览器加载单一的页面,后续请求都无需再离开此页目标旨在用为用户提供了更接近本地移动或桌面应用程序的体验。流程第一次请求时,将导航页传输到客户端,其余请求通过获取数据实现数据的传输通过或远程过程调用。 什么是单页面应用(SPA)? 单页面应用(SPA)是指用户在浏览器加载单一的HTML页面,后续请求都无需再离开此页 目标:旨在用为用户提供了更接近本地...

    EasonTyler 评论0 收藏0
  • 前端面试题(3)现代技术

    摘要:什么是单页面应用单页面应用是指用户在浏览器加载单一的页面,后续请求都无需再离开此页目标旨在用为用户提供了更接近本地移动或桌面应用程序的体验。流程第一次请求时,将导航页传输到客户端,其余请求通过获取数据实现数据的传输通过或远程过程调用。 什么是单页面应用(SPA)? 单页面应用(SPA)是指用户在浏览器加载单一的HTML页面,后续请求都无需再离开此页 目标:旨在用为用户提供了更接近本地...

    trigkit4 评论0 收藏0
  • 用ES6编写AngularJS程序是怎样一种体验

    摘要:不用我赘述,前端开发人员一定耳熟能详。命令会用这个配置,生成的结果都会给文件名加,文件也会压缩。可用工具介绍启动调试服务器,使用作为配置,不直接生成物理文件,直接内存级别响应调试服务器资源请求。 AngularJS不用我赘述,前端开发人员一定耳熟能详。有人称之为MVWhatever框架,意思是使用AngularJS,你可以参考任意范式进行应用开发,无论是MVC、还是MVVVM都信手拈来...

    lastSeries 评论0 收藏0

发表评论

0条评论

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