Backbone.Marionette v3 到 v4 升级完全指南:必改项、弃用项与源码级迁移实操
前端【免费下载链接】backbone.marionetteMarionette v4 for Backbone applications. Maintenance fixes; new development continues in marionettejs/marionette.项目地址https://gitcode.com/gh_mirrors/ba/backbone.marionette点击查看免费下载导读Marionette v4 是 Backbone 应用框架的一次大规模重构版本引入了大量破坏性变更breaking changes。本文以官方升级指南 docs/upgrade-v3-v4.md 为骨架逐一解析 v3 → v4 的必改项与推荐项并结合本仓库源码v4.1.3见 package.json说明底层实现帮助你快速评估迁移工作量、定位每处报错对应的修复方式。读完本文你将掌握如何用CollectionView取代CompositeView、如何改用命名导出与MnObject、如何重新配置渲染器与行为系统以及如何通过Features标志管理DEV_MODE等新能力。升级概览v4 的三大主线从 v3 到 v4所有破坏性变更可以归纳为三条主线API 简化API simplification删除使用率低的类与配置CompositeView、AppRouter、Renderer、TemplateCache、noConflict、triggerMethodOn等减少概念数量。性能优化Performance improvement去掉全局实例与深层继承、关闭默认的子视图事件代理、不再克隆序列化数据、render不再绑定this。面向现代 JavaScriptES6/ESM以命名导出替代默认导出、移除Backbone.Marionette全局挂载、Marionette.Object改名MnObject、_.bind换成Function.prototype.bind。当前仓库的入口文件 src/backbone.marionette.js 是 v4 模块体系的直接证据所有类View、CollectionView、MnObject、Region、Behavior、Application均通过命名导出暴露同时保留了兼容用的默认导出对象。一、必改项Required changes破坏性变更逐条迁移1. CompositeView 被移除改用 CollectionView旧行为提供了CompositeView类可同时渲染模板与子视图集合。新行为CompositeView已不存在。原因API 简化。CompositeView的绝大多数能力已并入CollectionView见 src/collection-view.js。修复多数场景只需把类名从CompositeView改成CollectionView旧实现被抽离为独立的marionette.oldcollectionview库该库为独立项目不在本仓库内。一个必须注意的连带变更实现递归树形视图时必须显式定义childView。v3 中CompositeView会自动用自身作为子视图v4 中不再有该默认行为// v3使用 compositeview const TreeView CompositeView.extend({ template: node-template }); // v4使用 collectionview必须显式声明 childView const TreeView CollectionView.extend({ template: node-template, childView() { return TreeView; } });从源码看CollectionView通过_getChildViewsrc/collection-view.js 附近解析childView配置来为每个模型构建子视图childView既可以是类也可以是返回类的函数——这正是递归树视图能够成立的原因。2. NextCollectionView 重命名为 CollectionView旧行为同时提供NextCollectionView新一代实现与旧的CollectionView。新行为只保留一个CollectionView其实现基于原NextCollectionView旧实现被移除并抽离为独立的marionette.oldcollectionview库。原因API 简化消除两个 CollectionView的混乱。修复把NextCollectionView全部替换为CollectionView旧版CollectionView用法按新实现迁移。3.childViewEventPrefix默认关闭旧行为childViewEventPrefix默认为true子视图事件会自动以childview:*前缀代理到父视图。新行为默认为false不再自动代理子视图事件。原因性能优化——每个子视图的代理监听都有成本。修复只在需要的视图上按需开启而不是全局打开更推荐用childViewEvents和childViewTriggers显式声明代理。源码层面特性标志集中定义在 src/config/features.jsconst FEATURES { childViewEventPrefix: false, triggersStopPropagation: true, triggersPreventDefault: true, DEV_MODE: false };CollectionView的ClassOptionssrc/collection-view.js中保留了childViewEventPrefix、childViewEvents、childViewTriggers等配置项说明这些能力仍然存在只是默认关闭、需要显式启用。4. Marionette 不再挂载到 Backbone 全局实例旧行为通过Backbone.Marionette访问整个库。新行为不再挂载到Backbone全局对象。原因支持 ES 命名导出。修复直接导入 Marionette 类或在使用独立脚本standalone script时使用全局Marionette实例。对应源码见 src/backbone.marionette.js所有类以export { View, CollectionView, MnObject, ... }形式命名导出。5.noConflict被移除旧行为noConflict允许在同一页面共存多份 Marionette 安装。新行为不再在库内部处理冲突。原因ES6 模块环境下该机制没有意义。修复如需多版本共存交给包管理器如 npm/yarn 的别名处理。6. AppRouter 被移除旧行为Marionette 内置路由器。新行为不再包含任何路由器。原因只有少数用户使用。修复使用任意路由器包括被抽离的marionette.approuter独立库。7. Renderer 类被移除改用setRenderer旧行为通过修改Renderer.render来替换默认渲染器。新行为Renderer类不存在改用Marionette.setRenderer(renderer)其参数签名与原Renderer.render一致。修复传入一个接收(template, data)并返回渲染结果的函数。源码佐证setRenderer的实现非常直接src/config/renderer.js// Static setter for the renderer export function setRenderer(renderer) { this.prototype._renderHtml renderer; return this; }顶层 src/backbone.marionette.js 的setRenderer会同时把它应用到View和CollectionView上默认的_renderHtml就是template(data)见 src/mixins/template-render.js。8.TemplateCache渲染路径被移除旧行为通过TemplateCache编译并缓存模板后渲染。新行为直接以template(data)方式渲染模板。原因TemplateCache只被少数用户使用。修复如确需缓存可自行引入抽离出的marionette.templatecache独立库。9. Behavior Lookup 全局查找被移除旧行为视图的behaviors配置可以只写名称通过全局Marionette.Behaviors.behaviorsLookup查找对应 Behavior 类。新行为Behavior 定义必须直接挂在视图上传入类本身。原因简化 API且 v4 不再有全局 Marionette 实例。修复把全局查找表改为在视图上直接引用 Behavior 类。v3 写法const MyBehavior Marionette.Behavior.extend({ /* ... */ }); Marionette.Behaviors.behaviorsLookup function() { return { FooBehavior: MyBehavior }; }; const V3View Marionette.View.extend({ behaviors: { FooBehavior: {} } });v4 写法const MyBehavior Behavior.extend({ /* ... */ }); const V4View View.extend({ behaviors: { FooBehavior: MyBehavior } });源码佐证见 src/mixins/behaviors.jsgetBehaviorClass现在只接受Behavior 构造函数本身或带behaviorClass属性的 options 对象不再有任何按名称全局查找的逻辑function getBehaviorClass(options) { if (options.behaviorClass) { return { BehaviorClass: options.behaviorClass, options }; } if (_.isFunction(options)) { return { BehaviorClass: options, options: {} }; } throw new MarionetteError({ message: Unable to get behavior class. A Behavior constructor should be passed directly or as behaviorClass property of options, // ... }); }10.attachElContent只在渲染器有返回值时调用旧行为无论渲染结果如何attachElContent都会被调用。新行为如果渲染函数没有返回值则不调用attachElContent。原因支持渲染器直接修改 DOM 内容的用法。修复如果需要attachElContent被调用至少让渲染函数返回一个空字符串。源码佐证src/mixins/template-render.js_renderTemplate(template) { const data this.mixinTemplateContext(this.serializeData()) || {}; const html this._renderHtml(template, data); if (typeof html ! undefined) { this.attachElContent(html); } }注意判断条件是typeof html ! undefined返回undefined不调用返回空字符串则会调用。11. 原生 Backbone.View 支持方式变化应用Eventsmixin旧行为Backbone.View实例可以直接被 Marionette 使用。新行为需要在视图类原型上应用Marionette.Eventsmixin 才能被 Marionette 使用。原因性能优化——Marionette 不再无条件包装所有视图。修复若项目不使用原生Backbone.View则无需改动否则在应用启动时一次性修补// 在应用启动时执行一次 import _ from underscore; import { Events } from backbone.marionette; _.extend(Backbone.View.prototype, Events);Eventsmixin 本身只包含triggerMethod见 src/mixins/events.js这是 Marionette 与视图交互所需的核心方法。12.triggerMethodOn被移除旧行为triggerMethodOn用于对没有该方法的对象调用triggerMethod。新行为需要此功能的对象应混入Marionette.Events。原因性能优化。修复与上一条支持原生 Backbone.View的迁移方式相同混入Events即可。13.isNodeAttached工具函数被移除旧行为提供工具函数isNodeAttached判断节点是否已挂载到 DOM。新行为函数不存在。原因API 简化。修复使用原生 DOM APIdocument.documentElement.contains(el);14.template: false使 render 变为 no-op旧行为设置template: false时不渲染模板但仍触发 render 相关事件。新行为不产生任何 render 事件。原因防止对render的错误使用没渲染却假装渲染过。修复如果之前靠template: false触发 render 事件请改用其他钩子或方法。15.showChildView与Application.showView返回被展示的视图旧行为View.showChildView和Application.showView返回 Region 对象。新行为返回被展示的视图本身。原因返回值更有用。修复需要 Region 时改用getRegion或Application.getRegion。源码佐证src/application.jsshowView(view, ...args) { const region this.getRegion(); region.show(view, ...args); return view; // v4 返回视图而非 region }16. View 数据序列化不再克隆数据旧行为模板渲染前 model 的 attributes 总是被克隆。新行为不再克隆。原因性能优化。修复若没有定义templateContext模板中直接修改数据可能污染真实 model必要时自行克隆。源码佐证src/mixins/template-render.jsserializeModel直接返回this.model.attributes引用mixinTemplateContext仅在存在templateContext时用_.extend({}, serializedData, templateContext)生成新对象。17. View 的render不再绑定到视图实例旧行为view.render内部已绑定this为视图。新行为render不再预绑定。原因性能优化。修复绝大多数场景不受影响如需在脱离视图上下文的地方调用render用call或apply显式指定this。18. Region 不再支持selector属性旧行为可以用selector或el指定 Region 的el。新行为只能用el。原因简化 API。修复把所有 Region 配置里的selector改名为el。源码佐证Region构造函数直接读取this.getOption(el)并校验src/region.jsClassOptions中也没有selector一项src/region.js 仅含allowMissingEl、parentEl、replaceElement。19. Region 的preventDestroy选项被移除旧行为region.show(view, { preventDestroy: true })/region.empty({ preventDestroy: true })可以防止离开的视图被销毁。新行为该选项不再可用。原因简化 API。修复如需在不销毁的情况下移除已展示的视图先调用detachView。20. 内部_.bind替换为Function.prototype.bind旧行为内部使用 underscore 的_.bind。新行为使用原生Function.prototype.bind。原因为 lodash 5 做准备。修复此项可能影响试图让 Marionette 支持 IE9 以下环境的场景如 package.json 的 browserslist 显示Explorer 10。21.Application、Behavior、Region不再继承MnObject旧行为这三类都继承Marionette.Object。新行为三者不再继承任何东西。原因浅继承shallow inheritance减少继承链开销。修复如果曾通过修改Object.prototype给所有类添加方法现在需要分别修改这些类。源码佐证Applicationsrc/application.js与Behaviorsrc/behavior.js都是独立的普通构造函数通过_.extend混入各自需要的 mixin只有MnObjectsrc/object.js自身混入CommonMixin、DestroyMixin、RadioMixin。22.destroy函数只代理单个参数旧行为传给destroy的任意数量参数都会被透传给事件处理器。新行为只传递一个参数。原因性能优化。修复需要传递多个数据时打包成一个对象。源码佐证src/mixins/destroy.jsdestroy(options) { if (this._isDestroyed) { return this; } this.triggerMethod(before:destroy, this, options); this._isDestroyed true; this.triggerMethod(destroy, this, options); this.stopListening(); return this; }destroy的签名固定为接收一个options参数并原样透传。23.defaults从 Behavior 移除旧行为Behavior 上的options和defaults都会被当作默认选项。新行为只有options定义 Behavior 的默认选项。原因简化 API。修复把所有defaults改名为options。24. View 定义中的options不再传给initialize旧行为视图定义里嵌套的options会被合并进构造参数并传给 Backbone.View 构造函数。新行为只有构造时传入的options会传给 Backbone.View 构造函数。原因性能优化。修复把默认的 Backbone.View 选项直接定义在视图实例属性上而不是写在定义层的嵌套options里。25.Error工具类变为私有旧行为Marionette.Error是公开可用的类。新行为没有可访问的Error类。原因简化 API 与维护成本。源码佐证错误工具仍存在于 src/utils/error.js但并未出现在 src/backbone.marionette.js 的导出列表中确实已成为内部实现细节。26.DEV_MODE变为特性标志旧行为在全局Marionette对象上设置DEV_MODE来显示弃用警告。新行为通过setEnabled(DEV_MODE, true)开启特性标志。原因v4 不再有全局Marionette对象。源码佐证src/config/features.jsfunction isEnabled(name) { return !!FEATURES[name]; } function setEnabled(name, state) { return FEATURES[name] state; }开启方式import { setEnabled } from backbone.marionette; setEnabled(DEV_MODE, true);同样地childViewEventPrefix也可以通过setEnabled(childViewEventPrefix, true)全局开启仍推荐按视图局部开启。二、推荐变更Recommended changes为下一次升级铺路1. 默认导出已被弃用改用命名导出旧行为包以 UMD 模块导出所有类/函数挂在默认导出的属性上。新行为包以 ECMAScript 模块提供命名导出带全部类的默认导出仍保留兼容但已标记弃用。原因对齐现代 JS 标准支持 tree shaking。修复按需导入每个类或用*批量导入。ES 模块语法// 旧行为 import Mn from backbone.marionette; const MyView Mn.View.extend({}); // 新行为只导入需要的类 import { View } from backbone.marionette; const MyView View.extend({}); // 或批量导入会破坏 tree shaking import * as Mn from backbone.marionette; const MyView Mn.View.extend({}); // 或自建一个默认导出全部类/函数的模块 // mymarionette.js —— 可在 webpack 中配置为 marionette 的别名 import * as Mn from backbone.marionette; export default Mn; // myview.js import Mn from ./mymarionette; const MyView Mn.View.extend({});CommonJS 语法// 旧行为 const Mn require(backbone.marionette); const MyView Mn.View.extend({}); // 新行为 const { View } require(backbone.marionette); const MyView View.extend({});源码佐证src/backbone.marionette.js文件同时提供export { ... }命名导出与export default { ... }兼容导出且默认导出对象中也包含Object: MnObject的别名见下条。2.Marionette.Object重命名为Marionette.MnObject旧行为对象基类以Marionette.Object导出。新行为以MnObject导出。原因避免与 ES import 场景下的原生Object冲突。修复把Marionette.Object全部改为MnObject过渡期内默认导出上仍可通过Mn.Object访问。// 旧行为 import Mn from backbone.marionette; const MyObj Mn.Object.extend({}); // 新行为导入命名导出 MnObject import { MnObject } from backbone.marionette; const MyObj MnObject.extend({});源码佐证类实现位于 src/object.jscidPrefix: mno导出名称为MnObject默认导出对象中保留了Object: MnObject这一兼容别名src/backbone.marionette.js。三、迁移检查清单与常见报错速查按迁移顺序整理一份可对照执行的清单序号检查项对应修复1是否使用CompositeView改为CollectionView递归树视图显式声明childView2是否使用NextCollectionView直接替换为CollectionView3是否依赖子视图自动事件代理按视图开启childViewEventPrefix或用childViewEvents/childViewTriggers显式代理4是否使用Backbone.Marionette全局改为命名导入5是否调用noConflict移除多版本用包管理器管理6是否使用AppRouter改用第三方/独立路由库7是否修改过Renderer.render改用Marionette.setRenderer(fn)8是否依赖TemplateCache自行引入独立缓存方案9是否使用behaviorsLookup全局查找在视图上直接引用 Behavior 类10渲染函数是否无返回值需要时至少返回确保attachElContent被调用11是否直接使用原生Backbone.View应用Eventsmixin 到其原型12是否使用triggerMethodOn混入Eventsmixin13是否使用isNodeAttached改为document.documentElement.contains(el)14是否使用template: false触发 render 事件改用其他钩子15是否依赖showChildView/showView返回 Region改用返回值视图需要 Region 时用getRegion16模板是否直接修改 model 数据定义templateContext或自行克隆17是否脱离上下文调用render用call/apply18Region 是否使用selector改名为el19是否使用preventDestroy改用detachView20是否要求 IE9 以下支持注意Function.prototype.bind的限制21是否修改过Object.prototype需同步修改Application/Behavior/Region22destroy是否透传多个参数打包成单个对象参数23Behavior 是否使用defaults改名为options24视图定义是否使用嵌套options改为直接在实例上定义默认属性25是否访问Marionette.Error移除相关代码已私有化26是否设置全局Marionette.DEV_MODE改用setEnabled(DEV_MODE, true)27是否使用默认导入改为命名导入以支持 tree shaking28是否使用Marionette.Object改为MnObject四、迁移后的验证方式完成代码迁移后可以通过仓库自带的测试体系验证改动是否符合 v4 语义单元测试覆盖了CollectionView的事件代理、排序、过滤等行为见 test/unit/collection-view/collection-view.spec.jschildViewEventPrefix等特性标志相关的验证可参考 test/unit/config/features.spec.js渲染器setRenderer与模板渲染路径的验证见 test/unit/config/renderer.spec.js 和 test/unit/mixins/template-render.spec.js本地运行测试yarn test见 package.json 的 scripts。结语Marionette v4 的升级核心是做减法删掉小众 API、关掉默认开销、拥抱 ES 模块。绝大多数破坏性变更都有机械化的修复方式改类名、改导入语句、改配置名真正需要重新设计的是依赖全局查找、自动事件代理和深层继承的少数场景。对照本文的清单逐项迁移并借助仓库中的源码与测试用例确认行为差异即可平稳完成 v3 → v4 的升级。赞分享前端【免费下载链接】backbone.marionetteMarionette v4 for Backbone applications. Maintenance fixes; new development continues in marionettejs/marionette.项目地址https://gitcode.com/gh_mirrors/ba/backbone.marionette点击查看免费下载相关推荐Actix Web 4.0 升级迁移完全指南从 v3 到 v4 的 Breaking Changes 逐项解析与实战迁移Actix Web 4.0 升级迁移完全指南从 v3 到 v4 的 Breaking Changes 逐项解析与实战迁移 导读 本文以 actix web/M后端Web框架lightweight-charts v3 到 v4 迁移指南破坏性变更全解析与升级实操lightweight charts v3 到 v4 迁移指南破坏性变更全解析与升级实操 本篇迁移指南以 website/docs/migrations/fr前端图表库金融科技数据可视化终极指南如何快速完成Linaria从v3到v4的零运行时CSS迁移终极指南如何快速完成Linaria从v3到v4的零运行时CSS迁移 Linaria是一个革命性的零运行时CSS in JS库它允许开发者在JavaScrip前端构建工具UI组件上一篇哔哩漫游X安卓B站客户端终极增强指南下一篇TinyUSB 0.12.0 版本更新详解OS 头文件路径、DCD 端点 API、CDC-NCM 与 UVC 1.5 新驱动创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考