¿Cuál es el método más complicado que escribiste en las aplicaciones web?

Escribí un artículo en Medium sobre cómo escribir aplicaciones web que puedan implementar la recarga en caliente usando RequireJS + React / Backbone

Puedes leer sobre eso aquí:

Recarga en caliente en 2015:

Lo esencial es que todas las partes de sus vistas deben volver a cargarse en caliente. Lo que eso significa si cambia una vista secundaria, significa que ha actualizado la vista principal, lo que significa que el enrutador tendrá vistas de carga bajo demanda si es necesario.

Entonces, en el enrutador Backbone podríamos tener:

uploadHistory: function () {
var routerOpts = {};
this.changeView (routerOpts, function (cb) {
require ([‘CSS_BASE / mapping-upload-history / style.css’, ‘REACT_VIEWS_BASE / mapping-file-history / HistoryView’], function (style, HistoryView) {
routerOpts.cssAdds = [estilo];
routerOpts.view = HistoryView;
cb (nulo);
}, función errback (err) {
console.error (err);
cb ();
});
});
},

por lo que la función del enrutador anterior es responsable de finalmente presentar esta vista principal:

/ * Globales Backbone, _, $, React, ReactDOM * /

definir(
[
‘+ appState’,
‘@todos los modelos’,
‘@allCollections’,
‘form2js’,
‘@allFluxActions’,
‘REACT_VIEWS_BASE / mapping-file-history / children / history-row’,
‘exigir’,
‘módulo’
],

función (appState, modelos, colecciones, form2js, allFluxActions, HR, require, module) {

const coll = collections [‘asignación-carga’];
const users = collections [‘usuarios’];

return React.createClass (Object.assign ({

getInitialState: function () {
regreso {
artículos: []
}
},

componentDidMount: function () {
this.runInitialData ();
this.listenTo (coll, ‘agregar eliminar’, this.onLocalModelChange);
},

runInitialData: function () {

datos var = [];

coll.models.forEach (function (model) {

var obj = model.toJSON ();
var user = users.findWhere ({id: obj.uploadedBy});
if (usuario) {
obj.uploadedBy = user.get (‘nombre de usuario’);
}

data.push (obj);
});

this.setState ({
artículos: datos
});

},

componentWillUnmount: function () {
this.stopListening ();
},

onHistoryCollectionAdd: function () {
this.setState (coll.toJSON ());
},

onLocalModelChange: function () {
this.runInitialData ();
},

getItems: function () {

devuelve this.state.items.map (function (item) {

regreso (



)

});
},

getTableHeader: function () {

regreso (

Baymax-Env

Archivo subido

Tipo de archivo

Mapeo

Usuario

Fecha

¿Tiene éxito?

)
},

render: function () {

HR = require (‘./ children / history-row’);

elementos const = this.getItems ();

regreso (

{this.getTableHeader ()}

{artículos}

)

}

}, Backbone.Events));

});

Como puede ver arriba, la vista principal tiene una vista secundaria llamada ‘historial-fila’, puede ver que el historial de la fila se hace referencia en dos lugares, una vez en la matriz requirejs dep y nuevamente en la función de representación. La razón por la que volvemos a hacer referencia a la vista secundaria en la función de representación es para habilitar la recarga en caliente. Sin volver a hacer referencia al archivo, nos quedaremos atrapados con la referencia original para el resto del ciclo de vida de la aplicación.

Aquí está la vista secundaria ‘fila de historial’:

/ * Globales Backbone, _, $, React, ReactDOM * /

definir([

‘+ appState’,
‘@todos los modelos’,
‘@allCollections’,
‘@allFluxActions’,
‘@ReactChildViewProto’
],

función (appState, modelos, colecciones, allFluxActions, ReactChildViewProto) {

var FluxCartActions = allFluxActions [‘FluxCartActions’];

return React.createClass (Object.assign ({

componentDidMount: function () {

},

componentWillUnmount: function () {
this.stopListening ();
},

render: function () {

elemento const = this.props.item;

regreso (

{item.baymaxEnv}

{item.fileName}

{item.fileType}

{item.mappingName}

{item.uploadedBy}

{item.createdAt || nulo}

);

}

}, ReactChildViewProto, Backbone.Events));

});

Si tiene interés en aprender más sobre cómo recargar en caliente con RequireJS y React, no dude en enviarme un mensaje o comentario.