Vue: [рд╕реБрд╡рд┐рдзрд╛] Vue рдЕрд╡рд▓реЛрдХрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  50рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: vuejs/vue

рдЕрджреНрдпрддрди:
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЙрдЪрд┐рдд рд╕рд▓рд╛рд╣ рдФрд░ рд╕рдм рдХреБрдЫ рдХреЗ рд╕рд╛рде vue-nonreactive рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИред


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЧреИрд░-рд╕рд╛рджреЗ рдореЙрдбрд▓ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ Vue рдХреЗ рдЕрд╡рд▓реЛрдХрди рдФрд░ рдЪрд▓рдиреЗ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕рдВрд╕рд╛рдзрди рдореЙрдбрд▓ рд╣реИ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдХреИрд╢ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ рддрд╛рдХрд┐ рд╡рд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХреЗред рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдХреИрд╢ рдореЗрдВ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдЕрдХреНрд╖рдо), рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдиреНрдп рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрдЯрд░реИрдХреНрд╢рдиред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╣рдо рдХреИрд╢ рдкрд░ рдПрдХ рдбрдореА рдСрдмреНрдЬрд░реНрд╡рд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдХреБрдЫ рдЗрд╕реА рддрд░рд╣...

import get from 'http';
import Resource from 'resource';


new Vue({
    data: { instance: {}, },
    ready() { this.fetch(); },

    methods: {
        fetch() {
            const Observer = Object.getPrototypeOf(this.instance.__ob__).constructor;

            get('/api/frobs')
            .then(function(data) {
                // initialize Resource w/ JSON document
                const resource = new Resource(data);

                // Protect cache with dummy observer
                resource.cache.__ob__ = new Observer({});

                this.instance = resource;
            });
        },
    },
});

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди

  • Vue рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ
  • рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЗрдЦреА рдЧрдИ рд╡рд╕реНрддреБ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕реАрдзреЗ Observer рд╡рд░реНрдЧ рдХреЛ рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рд╕реНрддрд╛рд╡:
Vue рдХреЗ рдЕрд╡рд▓реЛрдХрди/рдЪрд▓рдиреЗ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рдЬреИрд╕реЗ, рдХреБрдЫ рдРрд╕рд╛...

const someThing = {
  nestedThing: {},
};

// make entire object non-reactive
Vue.nonreactive(someThing);

// make nested object non-reactive
Vue.nonreactive(someThing.nestedThing);
vm.$set('key.path', someThing);

рд╡рд┐рдЪрд╛рд░:

  • рдпрджрд┐ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХреБрдВрдЬреА рдкрде рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ Vue рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,

``` рдЬреЗрдПрд╕
vm.$set('a', Vue.nonreactive({});

// рд╕реЗ рдЕрд▓рдЧ..
рд╡реАрдПрдоред $ рд╕реЗрдЯ ('рдП', {
someKey: Vue.nonreactive({}),
});
```

  • рдХреНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╡рд╕реНрддреБ рдХреЛ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,

``` рдЬреЗрдПрд╕
// рддреНрд░реБрдЯрд┐
Vue.nonreactive(vm.$data.a)

// рдорд╛рдиреНрдп
Vue.nonreactive(_.clone(vm.$data.a));
```

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

  1. рдЖрдк рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ / рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЕрд╡рд▓реЛрдХрди рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреА рдЬрд░реВрд░рдд рд╣реИ data , рдХрд╛ рдЙрдкрдпреЛрдЧ Object.freeze() рдЙрд╕ рдкрд░;
  2. рдЖрдк рдПрдХ рд╡рд╕реНрддреБ рдореЗрдВ рдбрд╛рд▓ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ data рдкрд░ рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП this ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ this рдХреЗ рд╕рд╛рде created() рд╣реБрдХ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рднреА 50 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ Object.freeze() рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛? рдпрд╣ v1.0.18 . рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИ

  1. рдЖрдк рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ / рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЕрд╡рд▓реЛрдХрди рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреА рдЬрд░реВрд░рдд рд╣реИ data , рдХрд╛ рдЙрдкрдпреЛрдЧ Object.freeze() рдЙрд╕ рдкрд░;
  2. рдЖрдк рдПрдХ рд╡рд╕реНрддреБ рдореЗрдВ рдбрд╛рд▓ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ data рдкрд░ рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП this ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ this рдХреЗ рд╕рд╛рде created() рд╣реБрдХ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • Object.freeze рдпрд╣рд╛рдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреИрд╢ рд╕рдордп рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдореБрдЦреНрдп рд╕рдВрд╕рд╛рдзрди _is_ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ред рдореБрдЭреЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдиреЗрд╕реНрдЯреЗрдб рдХреИрд╢ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред

рддреЛ рд╢рд╛рдпрдж рдпрд╣ рдЖрдкрдХреЗ рдореЙрдбрд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЙрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдиреАрдЪреЗ рдХреНрдпреЛрдВ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХреНрдпреЛрдВрдХрд┐ рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Author рдФрд░ Post рдореЙрдбрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦрдХ рдореЙрдбрд▓ рдкреЛрд╕реНрдЯ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП posts рдирд╛рдордХ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреИрд╢ рдореЗрдВ рд╕рдВрдмрдВрдз рдбреЗрдЯрд╛, рд╕рд╛рде рд╣реА рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдЧреНрд░рд╣ рд╢рд╛рдорд┐рд▓ рд╣реИред

рд▓реЗрдЦрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ред рдкреЛрд╕реНрдЯ рдХреИрд╢ рд╕реЗ рдкреЛрд╕реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, Vue рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░рд╛рдЬреНрдп-рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ Vue рдЙрджрд╛рд╣рд░рдг рдХреЗ data рдбрд╛рд▓рдиреЗ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╢реБрджреНрдз рд╕реНрдерд┐рддрд┐ рдХреЛ Vue рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рджреЗрдЦреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рд╡реИрд╕реЗ рднреА рдЗрди рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ Vue рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкрд╣рд▓рд╛, рд╕реНрдкрд╖реНрдЯ рдкреНрд░рд╢реНрди - рд╢реБрджреНрдз рдЕрд╡рд╕реНрдерд╛ рд╕реЗ рдЖрдкрдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд╛рдЬреНрдп рд╣реИрдВ:

  • рдореЙрдбрд▓ рд╕реНрдерд┐рддрд┐ (рд╕реНрдерд╛рдпреА, рдПрдХ рд╕реНрдЯреЛрд░ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯреВрдбреВ)
  • рджреГрд╢реНрдп рд╕реНрдерд┐рддрд┐ (рдЕрд╕реНрдерд╛рдпреА, рдбреЗрдЯрд╛ рдЬреЛ рджреГрд╢реНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдп рд╕реВрдЪреА рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд/рджрд┐рдЦрд╛рдПрдВ)

рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА:
рд╕рд╣реА рд╣реИред рдореЙрдбрд▓ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 'рдЬрдЯрд┐рд▓' рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдиреБрд░реЛрдз рд╡рд░реНрддрдорд╛рди рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣реИред рд╕рд╛рде рд╣реА, рдореЗрд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЕрд╡рд▓реЛрдХрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рд╡рд░реНрддрдорд╛рди рд╕реЗрдЯрдЕрдк w/рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдХрд╛ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИ:

<!-- layout -->
<post :post="post"></post>
<author :author="author" ><author>
<comments :comments="comments"></comments>
import post from 'components/post';
import author from 'components/author';
import comments from 'components/comments';
/* post = {
 *     template: '...'
 *     props: ['post'],
 *     data: () => {collapsed: false},
 *     ...
 * };  */

new Vue({
    el: 'body',
    data() { 
        instance = postStore.fetch({include: ['author', 'comments.author']})
        Vue.nonreactive(instance.cache)

        return {post: instance, },
    },
    components: {
        post,
        author,
        comments,
    },
    ...
});

рдореВрд▓ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдШрдЯрдХреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХреЛрдВ рдХреЛ рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ/рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдПрдХ рдореВрд▓ рджреГрд╢реНрдп рд╣реИред рдЪрд╛рдЗрд▓реНрдб рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд▓рд╛рддреЗ рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, _user's_ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдо _post's_ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреАред

рдореЙрдбрд▓ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдХрд╛рдлреА 'рдЧреВрдВрдЧрд╛' рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдПрдВ рдиреЗрд╕реНрдЯреЗрдб рдирд╣реАрдВ рд╣реИрдВ ( {post: {author: {}, comments: []}} ), рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреИрд╢ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, post.comments[2].author рд╡рд╣реА рд╕рдЯреАрдХ рд╡рд╕реНрддреБ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреИрд╕реЗ post.author ред рдЗрд╕рд▓рд┐рдП, рд▓реЗрдЦрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдХрдИ рдкреНрд░рддрд┐рдпрд╛рдВ рд░рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рдХреИрд╢ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рдХреЛрдИ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИ - рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдлрд╝реЗрдЪ рдкрд░ рдмрдирд╛рдП рдЧрдП рд╣реИрдВред

рд╕рд╛рде рд╣реА, рдпрд╣ рдирд╣реАрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рдЕрдм рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рдХрд▓реНрдк 'рдирд┐рдЬреА' рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкреНрд░рдореБрдЦ рд╕рд┐рдВрдЧрд▓ рдпрд╛ рд╢рд╛рдпрдж рдбрдмрд▓ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╡рд╛рд▓реЗ рд╕рджрд╕реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЙрдЪрд┐рдд рд╕рд▓рд╛рд╣ рдФрд░ рд╕рдм рдХреБрдЫ рдХреЗ рд╕рд╛рде vue-nonreactive рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИред

@rpkilby рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

@rpkilby рдПрдХ рддрд░рд╣ рд╕реЗ рдореИрдВ рдПрдХ рд╡рд╕реНрддреБ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ

var newObj = JSON.parse(JSON.stringify(obj))

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ "рд░рд╛рдЬреНрдпреЛрдВ" рдХреА рдПрдХ рд╕рд░рдгреА рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рд░рд╛рдЬреНрдп рдЗрддрд┐рд╣рд╛рд╕ рд╡рд╕реНрддреБ рдХреЛ vuex рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдпрд╣ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдерд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд╕реНрддреБ рдереА рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рдереАред рдореБрдЭреЗ рд╕рдВрджрд░реНрднреЛрдВ, рдЧрддрд┐рд╢реАрд▓ рдЕрдкрдбреЗрдЯ рдЖрджрд┐ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдереАред

рдЕрднреА рд╡рд╕реНрддреБ рдХреЛ рдлреНрд░реАрдЬ рдХрд░рдирд╛ рдХреЛрдИ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред [Vue-nonreactive] рдореЗрдВ Vue рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рдЖрдЧреЗ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ instance.__ob__ !== false рдЬреИрд╕реЗ рдХреЛрдб рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬрд╛рдВрдЪ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧреА? рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдХрд┐ рдХреИрд╢ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рджреЗрдЦреА рдЬрд╛рдПрдВрдЧреАред

class Unobservable {
  construtor() {
    Object.defineProperty(this, '__ob__', {  
      enumerable: false,  configurable: false,
      writable: false, value: false,
    });
  }
}

рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ Vue рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрджреНрджрд╛ рд╣реИред

Vue рдХреЛ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреА 1-рд╕реНрддрд░ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рджреЗрдЦрдиреЗ (рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреИрд╕реЗ рдмрддрд╛рдПрдВ?

рдореЗрд░рд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдм data.curObj рдмрджрд▓ рдЬрд╛рдП рддреЛ Vue рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП,
рд▓реЗрдХрд┐рди curObj.position , curObj.rotation , рдЖрджрд┐ рдХреЗ рд╕рд╛рде рди рдХрд░реЗрдВред

рдореИрдВ Object.freeze , рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ рдЬрдм рддреАрди.рдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдореБрдЭреЗ рдиреАрдЪреЗ рдХрд░рдирд╛ рд╣реИ?
(рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдорд╛рди рд╕реНрдерд╛рди рдкрд░ рдХрд┐рдпрд╛ рдерд╛)

data () {
  return {
    wrapper: Object.freeze({
      actual: [bigData]
    })
  }
},
methods: {
  operation () {
    this.wrapper = Object.freeze({
      actual: [newBigData]
    })
  }
}

// core/observer/watch.js
function _traverse (val: any, seen: ISet) {
  let i, keys
  const isA = Array.isArray(val)
  if ((!isA && !isObject(val)) || !Object.isExtensible(val)) {
    return
  }
  // ...
// core/observer/index.js
export function observe (value: any, asRootData: ?boolean): Observer | void {
  if (!isObject(value) || value instanceof VNode) {
    return
  }
  let ob: Observer | void
  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
    ob = value.__ob__
  } else if (
    observerState.shouldConvert &&
    !isServerRendering() &&
    (Array.isArray(value) || isPlainObject(value)) &&
    Object.isExtensible(value) &&
    !value._isVue
  ) {
    ob = new Observer(value)
  }
  // ...
> curObj PerspectiveCamera {uuid: "BD3C14DF-8C2B-4B96-9900-B3DD0EAC1163", name: "PerspectiveCamera", type: "PerspectiveCamera", parent: null, children: Array(0),┬атАж}

> Lodash.isPlainObject(curObj) false
> Vue.isPlainObject(curObj) true
  1. рдХреНрдпрд╛ рд╣рдо рдХреЗрд╡рд▓ Object.isExtensible ( Object.freeze ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд╡рд▓реЛрдХрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╢рд░реНрдд рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?
  2. рдХреНрдпрд╛ рд╣рдо Vue.isPlainObject рдбрд┐рдЯреЗрдХреНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЖрдк рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

var newObj = { ...obj };

рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ isPlainObject рд╡рд┐рдзрд┐ рдХреЛ рдЭреВрдареА рд╡рд╛рдкрд╕реА рдХрд░ рджреЗрдЧрд╛ред

/**
 * Makes an object and it's children unobservable by frameworks like Vuejs
 */
class Unobservable {
  /**
   * Overrides the `Object.prototype.toString.call(obj)` result
   * <strong i="6">@returns</strong> {string} - type name
   * <strong i="7">@see</strong> {<strong i="8">@link</strong> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag}
   */
  get [Symbol.toStringTag]() {
    // Anything can go here really as long as it's not 'Object'
    return 'ObjectNoObserve';
  }
}
>> Object.prototype.toString.call(new Unobservable());
   "[object ObjectNoObserve]"

рд╣рд╛рдп рд╕рдм, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдЦреЛ рдЧрдпрд╛ рдПрдХ рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдбреЗрдЯрд╛ рд╢реБрджреНрдз рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ article рдЕрдкрдиреЗ author рдпрд╛ comments ред рдЬрдм рдореИрдВ article.author рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЙрд╕ рд╕рдВрдмрдВрдз рдХреИрд╢ рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╕рдВрдкрддреНрддрд┐ рд▓реБрдХрдЕрдк рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмрд╛рддреЗрдВ:

  • рдХреИрд╢ рд╢реБрджреНрдз рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдЗрд╕реЗ Vue рджреНрд╡рд╛рд░рд╛ рджреЗрдЦрд╛ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдмрд░реНрдмрд╛рджреА рд╣реИред
  • рдХреИрд╢ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рдЗрди рдЧрддрд┐рд╢реАрд▓ рд▓реБрдХрдЕрдк/рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • рдХреИрд╢ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрдк рдЙрд╕реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдбреЗрдЯ рд╣реЛрддрд╛ рд╣реИред

рдХреБрдЫ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ:

  • JSON рд╕реНрдЯреНрд░рд┐рдВрдЧ/рдкрд╛рд░реНрд╕ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреЛрдиреЛрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдХреИрд╢ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдореВрд▓ рдХреИрд╢ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред рдореВрд▓ рдХреИрд╢ рд╕рдВрджрд░реНрдн рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдРрдк рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЗрди рдЧрддрд┐рд╢реАрд▓ рд▓реБрдХрдЕрдк рдФрд░ рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд┐рдирд╛ рдХреИрд╢ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡реНрдпрд░реНрде рд╣реИ, рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдореВрд▓ рдореЙрдбрд▓ рдкрд░ рд╕рд░рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрдирд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдпреЗ рд╕реБрдЭрд╛рд╡ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рддреЛрдбрд╝рддреЗ рд╣реИрдВред
  • рдпрджрд┐ рдЖрдк рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рдХрд╛рд░ Vue рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рд╣реИрдВ, рддреЛ @Mechazawa рдХреЗ рд╕реБрдЭрд╛рд╡ рд╕рдордЭ рдореЗрдВ

рдореЗрд░реА рдПрдХрдорд╛рддреНрд░ рдЖрд▓реЛрдЪрдирд╛:

Vue-nonreactive рдореЗрдВ Vue рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рдЖрдЧреЗ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░реА рдмрд╛рдд рдХреНрдпреЛрдВ рд╣реЛрдЧреА? рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ Vue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдкреНрд▓рдЧрдЗрди Vue рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВ, рддреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдирд┐рд░реНрдорд╛рдг рдЙрдкрдХрд░рдг рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдорд╛рд░реНрдЯ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ ред рдПрдХ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд░рдирдЯрд╛рдЗрдо рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИред


рд╡реИрд╕реЗ рднреА, рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реБрдИ рдХрд┐ рдЗрд╕ рдкреЛрд╕реНрдЯ рдиреЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реА рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдХрдИ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдмрд╕ рдЕрдкрдиреА рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рд╕реБрдЭрд╛рд╡ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛, рдФрд░ рдкрд╛рдпрд╛ рдХрд┐ рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ Vue рдХреЗ рдЕрд╡рд▓реЛрдХрди рддрд░реНрдХ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ: _рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред_

рдкреГрд╖реНрдарднреВрдорд┐

рдореЗрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рддреГрддреАрдп рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдУрдкрдирд▓реЗрдпрд░) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдХреЛ рд╢реВрд╣реЙрд░реНрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд┐рд░рджрд░реНрдж рд╣реЛ рдЧрдП рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛ рджреВрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ OpenLayers рдХреЗ рдкрд╛рд╕ рд╡рд╣ рдЪреАрдЬреЗрдВ рд╣реЛрдВ рдЬреЛ рд╡рд╣ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП Vue рдХреЛ рдЗрди рднрдпрд╛рдирдХ рд░реВрдк рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб, uber рдХрдпрд╛рдордд рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдЦреЗрд▓рдирд╛ рд╣реИред рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореЗрд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рдЧрднрдЧ 3 рдЧреАрдЧрд╛ рд░реИрдо (рд╣рдорд╛рд░реЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдпрд╣ рд╕рдм Vue рджреНрд╡рд╛рд░рд╛ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдзреАрдорд╛ рдерд╛ред рдореИрдВрдиреЗ Vue-nonreactive рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓реА, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╣рдореЗрдВ рд▓рдЧрднрдЧ 1 рдЧрд┐рдЧ рддрдХ рдиреАрдЪреЗ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдПред Vue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рдЧрднрдЧ 350megs рдкрд░ рдмреИрдард╛ рдерд╛ред

рд╕рдорд╛рдзрд╛рди

рдЖрдк рдЬреЛ рдХреБрдЫ рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдХреЗрд╡рд▓ configurable: false рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред рдпрд╣ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИ рдЬрд┐рддрдирд╛:

Object.defineProperty(target, 'nested', { configurable: false });

(рдпрд╣ nested рд╕рдВрдкрддреНрддрд┐, рдФрд░ рдЗрд╕рдХреА рд╕рднреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗ рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред)

рдЗрддрдирд╛ рд╣реА! рдХреЛрдИ Vue рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрдХреАрдирди рдЧрд▓рдд рднреА рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЖрд╡реЗрджрди 200megs рддрдХ рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╕рд░рд▓ рдФрд░ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ 'рдЖрдзрд┐рдХрд╛рд░рд┐рдХ' рддрд░реАрдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Vue рдХреА рдУрд░ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдк - рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдЕрд╡рд▓реЛрдХрди рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд░реЛрдХрдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░реЛрдк рд╡реЙрдЪрд░ рд╣реИ, рдЗрд╕рдХреЗ рднреАрддрд░ рдореИрдВ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдореИрдВ рдкреВрд░реА рдбреЗрдЯрд╛ рддреИрдпрд╛рд░реА рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдбреАрдУрдПрдо рдЕрдкрдбреЗрдЯ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

@intijk рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВред рджреЗрдЦрд┐рдП, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ; Vue рдХреЛ рдЕрдВрддрддрдГ рдЖрдкрдХреЗ рд░рд╛рдЬреНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдмрд╕ рд░реБрдХрдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИред рдпрджрд┐, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдордзреНрдпрд╡рд░реНрддреА рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдВрдд рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рд╕реНрдпреВрдбреЛрдХреЛрдб):

doUpdate()
{
   const state = _.cloneDeep(this.myState);

  // Do intermediate state updates

  this.myState = state;
}

(рдСрдмреНрдЬреЗрдХреНрдЯ рд░рд┐рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп Vue рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВред)

рдореЗрд░реА рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реЛрдЧреА рдХрд┐ рдЙрдкрд░реЛрдХреНрдд configurable рдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдмрдбрд╝реА рд╡рд╕реНрддреБ рдХреЗ рдЙрди рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдм _does_ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ vuex рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред

@ рдореЛрд░реНрдЧреБрд▓ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдЯреНрд░рд┐рдХ рдХрд╛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдм рдЗрд╕ рдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдм рдПрдХ рддрд░рд╣ рдХрд╛ рдмрдбрд╝рд╛ рд╣реИ, 2M рд╕реЗ 100M рддрдХ, рдРрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдбреАрдк рдХреЙрдкреА рдХрд░рдирд╛ рдХрд╛рдлреА рджрд░реНрджрдирд╛рдХ рд╣реИред

@intijk рдЬреЛ рдХреБрдЫ рдХреЗ рд▓рд┐рдП Vue рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ?

@ рдореЛрд░реНрдЧреБрд▓
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдорд╛рдорд▓рд╛ рдЬрдЯрд┐рд▓ рд╣реИ, рдорд╛рдорд▓рд╛ рд╣реА рд╕рд░рд▓ рд╣реИ, рдмрд╕ рдбреЗрдЯрд╛ рдмрдбрд╝рд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреБрдЫ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░реЗрдЧрд╛, рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдШрдЯрдХ рд╣реИред

рдХрд┐рд╕реА рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рднреАрддрд░ рдПрдХ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ? рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рд╕рд░рдгреА рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ...

template: '<div v-html="markdown.render(input, env)"></div>',
props: ['id', 'input'],
computed: {
  env:      function() { return { reactive:this.id, non_reactive:[] } },
  markdown: function() { return Markdown },
},

// within markdown.render():
  env.non_reactive[0] = internal_data;

рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрд╡-рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдирд╣реАрдВ рд╣реИ :-)

рд╣реЗ рд▓реЛрдЧреЛрдВред рдореБрдЭреЗ рдЕрднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЖрд░рдкреАрдХрд┐рд▓реНрдмреА рдХреА рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рд╣реИ: рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ Vue Virtual DOMs (рдпрд╛ vnode рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреА рд╣реИред рдореИрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдРрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рд╡реИрд╕реЗ рднреА, рдпрд╣ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдореИрдВ рдЗрд╕ JSON рдХрд╛ рдЙрдкрдпреЛрдЧ Vue рдореЗрдВ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдЗрд╕реЗ Vue рджреНрд╡рд╛рд░рд╛ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВрдиреЗ рдЖрд░рдкреАрдХрд┐рд▓рдмреА рдФрд░ рдореЛрд░реНрдЧреБрд▓ рдХреЗ рддрд░реАрдХреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред (рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдореИрдВ рдПрдХ рдЯреАрдо рдореЗрдВ рд╣реВрдВ, рдЬрдмрдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рд╡реАрдпреВ рд╕реЗ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рд╢рд╛рдпрдж рдЬреЗрдПрд╕рдУрдПрди рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдореЗрд░рд╛ рд╡реАрдпреВ рд╕рдВрд╕реНрдХрд░рдг 2.5.16 рд╣реИред ) рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ Vue рдЯреНрд░реИрд╡рд░реНрд╕ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рд╕рдорд╛рд░реЛрд╣ _traverse (рд╡реИрд▓, рджреЗрдЦрд╛) {
рд╡рд░ рдореИрдВ, рдЪрд╛рдмрд┐рдпрд╛рдБ;
рд╡рд░ isA = Array.isArray (рд╡реИрд▓);
рдЕрдЧрд░ ((!isA && !isObject(val)) || Object.isFrozen(val) || VNode рдХрд╛ рд╡реИрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕
|| (рд╡реИрд▓ && рд╡реИрд▓ ['__vueNonReactive__'])) {
рд╡рд╛рдкрд╕реА
}
...
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ "val && val['__vueNonReactive__']" рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВред рдлрд┐рд░ рдореИрдВ JSON рдХреЗ рд░реВрдЯ рдиреЛрдб рдХреЗ рд╕рд╛рде "__vueNonReactive__ = true" рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ? рдФрд░ рдХреНрдпрд╛ рдЗрд╕реЗ Vue рдореЗрдВ рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗ Vue рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ? (рдСрдмреНрдЬреЗрдХреНрдЯ.рдлреНрд░реАрдЬрд╝ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛)

рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ https://github.com/vuejs/vue/blob/v2.5.16/src/core/observer/index.js#L121
рд╕реЗрдЯ val._isVue = true vue рдирд┐рд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реИред

рдЖрдЬ рдореИрдВ рдПрдХ рдорд╛рдорд▓реЗ рд╕реЗ рдорд┐рд▓рд╛ рдХрд┐, Vue mapbox-gl рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рд╣реБрдИрдВ, рдирдХреНрд╢рд╛ рд╣рд▓реНрдХрд╛ рд╣реЛ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдорд╛рдирдЪрд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдХреЛ Vue рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ map._isVue = true рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП +1ред рдореИрдВ рдПрдХ рдмрдбрд╝реА рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдШрдЯрдХ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдореЗрдореЛрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ 800 рдПрдордмреА рд╕реЗ 43 рдПрдордмреА рддрдХ рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ
рдореИрдВ рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП @magicdawn рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @Mechazawa рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред
__ob__ рдХреЗ configurable рдХреЛ рдЭреВрдареЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЬрдм рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ __ob__ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддреЛ Vue рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдПрдХ Vue рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ Vue рдЪрд░ рдХреЛ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ (рдпрд╣ рдкрд╣рд▓реЗ рдХреЗ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред

рдпрд╣ vue- nonreactive - рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рджреЗрдЦреЗрдВ - рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди Vue рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред


рдЪрд░ рдХреЛ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ Vue-Static рджреЗрдЦреЗрдВ ред

<script>
export default {
    static() {
        return {
            map: null,
        };
    },
    mounted() {
        this.map = new mapboxgl.Map({...}); /* something heavy */
    },
};
</script>

рд╣рд╛рдп @samuelantonioli - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ vue-static рдХреБрдЫ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, vue-nonreactive рдПрдХ рдПрдХрд▓ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрд╡рд▓реЛрдХрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдЬрдмрдХрд┐ рд╢реЗрд╖ рд╡рд╕реНрддреБ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░рдЦрддрд╛ рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд░рд╛рджреЗ рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рд╣реИрдВред рд╕реНрдереИрддрд┐рдХ рдЧреБрдг рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдЧреБрдг рджреЗрдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рди рд╣реА рдЙрдирдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдореЙрдбрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреИрд╢ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реБрдХрдЕрдк рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдореИрдВ instance рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд instance.author рдХреЛ рджреЗрдЦрдирд╛/рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди instance._cache ред

new Vue({
    data() {
        const instance = postStore.fetch({include: ['author', 'comments.author']})
        Vue.nonreactive(instance._cache)

        return {post: instance, },
    },
    ...
});

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рд╕рд┐рд░ рдКрдкрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдЧрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ/рдкреНрд░реЙрдХреНрд╕реА рдирд┐рд░реНрдорд╛рдг рдХреЛ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@LinusBorg - рдореБрдЭреЗ рдПрдХ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╢рд╛рдЦрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ рдХрд╣рд╛рдБ рд╣реЛ рд░рд╣рд╛ рд╣реИ?

рд╣рдо рдЕрднреА рднреА рд╡рд╣ рдЕрд╡рдзрд╛рд░рдгрд╛/рдкреНрд░рдпреЛрдЧ рдЪрд░рдг рд╣реИрдВ рдФрд░ рдЕрднреА рддрдХ рдПрдХ рд╢рд╛рдЦрд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХреА рд╣реИред рдЗрд╕ рдкрд░ рдЧрдВрднреАрд░ рдХрд╛рдо рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2.6 рдЕрдкрдбреЗрдЯ рджрд░рд╡рд╛рдЬреЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ, рдЬреЛ рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЬрд▓реНрдж рд╣реА рд╡реАрдпреВ-рдХреНрд▓реА 3.0 рдЖрдЙрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдЕрджреНрдпрддрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ ES6 рдкреНрд░реЙрдХреНрд╕реА рдкреЗрд╢ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдорд╕реНрдпрд╛ рдЙрд╕реА рджрд╛рдпрд░реЗ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред рдореЗрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдореИрдВ рдЙрдирдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдЙрдирдХреЗ рдУрд╡рд░рд╣реЗрдб рдмрдирд╛рдо рд╡реВ рдХреЗ рд╡рд░реНрддрдорд╛рди рдЕрд╡рд▓реЛрдХрди рдХреЗ рдКрдкрд░реА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд▓рдЧрддрд╛ рд╣реИред рд╢реИрддрд╛рди рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╣реЛрдЧрд╛, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ Vue-Static рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрдорд╛рдиреА рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ JS рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдЙрд╕реЗ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЙрд╕рдХрд╛ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ; рдЪреВрдВрдХрд┐ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдорд╛рди рдХрднреА рднреА рдкреБрдирд░реНрдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░, рдпрд╣ рдЪрд┐рдВрддрд╛рдУрдВ рдХрд╛ рдмреЗрд╣рддрд░ рдЕрд▓рдЧрд╛рд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдкрдиреЗ vue рдШрдЯрдХреЛрдВ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдореЗрдВ, рдЧреБрдгреЛрдВ рдХреЛ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдореЗрд░реА рдЪрд╛рд▓ рдЕрднреА рднреА рдХрдо рд╕реЗ рдХрдо рдЖрдХреНрд░рд╛рдордХ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо Vue рдирд┐рд░реНрднрд░ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рдорд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ ES рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛; рдЖрдк рдЕрднреА рднреА рд╢рд╛рдпрдж рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЧреБрдгреЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдо _know_ __ob__ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ... рд╣рдо рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

рд╕рд╛рде рд╣реА, рдпрд╣ 8+ рдорд╣реАрдиреЛрдВ рд╕реЗ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдбрдХреНрд╢рди рдХреЛрдб рдореЗрдВ рдПрдХ рд╡рд┐рдЬреЗрддрд╛ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред ;) (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ @samuelantonioli рдХреЗ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рд╕реНрдерд╛рди рд╣реИ; рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ OpenLayers рдорд╛рдирдЪрд┐рддреНрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ Vue рдХреЗ рдЕрдВрджрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдмрд┐рдирд╛ Vue рдЧреБрдмреНрдмрд╛рд░реЗ рдХреЗ рд╣рдорд╛рд░реА рдореЗрдореЛрд░реА 2.4 gigs ...)

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдпрд╛рдд рдореЙрдбреНрдпреВрд▓ рдФрд░ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ Vue-Static рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдмрд╕ рдПрдХ рдРрд╕рд╛ рдкреИрдЯрд░реНрди рдЪрд╛рд╣рд┐рдП рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рд╕рд┐рдЦрд╛ рд╕рдХреВрдВ рдЬреЛ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдордЭрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛред рдЖрдпрд╛рдд-рдореЙрдбреНрдпреВрд▓-рдФрд░-рдЙрдкрдпреЛрдЧ-рдЧрдгрдирд╛-рдЧреБрдг рдкреИрдЯрд░реНрди рд╕реНрдкрд╖реНрдЯ рдЖрдИрдПрдордУ рдирд╣реАрдВ рд╣реИред


рдереЛрдбрд╝рд╛ рд╕рд╛ рдУрдЯреА: рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ ES6 рдкреНрд░реЙрдХреНрд╕реА рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВ (рдЖрдИрдИ 11 рдФрд░ рдиреАрдЪреЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдЕрдЧрд░ рдХреЛрдИ рд╕рдВрдЧрддрддрд╛ рдкрд░рдд/рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдкреЙрд▓реАрдлрд┐рд▓ рд╣реЛрдЧреА рддреЛ рд╣рдо рдХрдареЛрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП Vue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Vue рдХреЛ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреА 1-рд╕реНрддрд░ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рджреЗрдЦрдиреЗ (рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреИрд╕реЗ рдмрддрд╛рдПрдВ?

рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП +1, рдмрд╛рд╣рд░реА рдЧреНрд░рд╛рдлрд┐рдХ рд▓рд┐рдм (рдЬрд┐рд╕рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБ-рд╕реНрддрд░реАрдп рдиреЗрд╕реНрдЯреЗрдб рдмрдбрд╝реА рд╡рд╕реНрддреБрдПрдВ рд╣реЛрддреА рд╣реИрдВ) рдХреЗ рд╕рд╛рде Vue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдХреБрдЫ рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╕рдВрдкрддреНрддрд┐рдирд╛рдо = {/* рдпрд╣рд╛рдВ рдХреБрдЫ рдмрдбрд╝рд╛ */};
рдорд╛рдЙрдВрдЯреЗрдб () рд╣реБрдХ рдореЗрдВ рдЧреИрд░-рдордирд╛рдП рдЧрдП рдЧреБрдгреЛрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ?

рд╣рд╛рдп @vlahanasред рджреЗрдЦреЗрдВ https://github.com/vuejs/vue/issues/2637#issuecomment -403630456ред

рд╕реЗрдЯ _isVue vue-devtool рдХреНрд░реИрд╢ рдХрд░ рджреЗрдЧрд╛, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

export default function setIsVue(val) {
    if (!val) return

    Object.defineProperty(val, '_isVue', {
        value: true,
        enumerable: false,
        configurable: true,
    })

    // vue-devtool
    // https://github.com/vuejs/vue-devtools/blob/c309065c57f6579b778341ea37042fdf51a9fc6c/src/backend/index.js#L616
    // хЫаф╕║цЬЙ _isVue х▒ЮцАз
    if (process.env.NODE_ENV !== 'production') {
        if (!val.$options) {
            Object.defineProperty(val, '$options', {
                value: {},
                enumerable: false,
                configurable: true,
            })
        }

        if (!val._data) {
            Object.defineProperty(val, '_data', {
                value: {},
                enumerable: false,
                configurable: true,
            })
        }
    }

    return val
}

рдпрд╣ рд╢реЛрд░ рдореЗрдВ рдЦреЛ рдЧрдпрд╛ рд▓реЗрдХрд┐рди рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд┐рдХреНрд╕ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

Object.keys(scene).forEach((key)=>{
  Object.defineProperty(target, 'nested', { configurable: false });
});

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рдореБрдЭреЗ THREE.Scene рдЖрд╕рдкрд╛рд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рд╕рдЪрдореБрдЪ рд╕рдВрдкреВрд░реНрдг рджреГрд╢реНрдп рдЧреНрд░рд╛рдлрд╝ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреА рдЧрдбрд╝рдмрдбрд╝реА рдмрди рдЬрд╛рдПред рдФрд░ рдлрд┐рд░ рдореИрдВ рдЕрднреА рднреА рдореВрд▓ рд╡рд╕реНрддреБ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕реЗ рдЧреБрдЬрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрддреНрддрдо!

рдЕрднреА рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рдЧреБрдгреЛрдВ рдХреЗ рдХрдИ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрддрд░ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
1

рднрд▓реЗ рд╣реА рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ

рдпрд╣ рд╢реЛрд░ рдореЗрдВ рдЦреЛ рдЧрдпрд╛ рд▓реЗрдХрд┐рди рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд┐рдХреНрд╕ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

Object.keys(scene).forEach((key)=>{
  Object.defineProperty(target, 'nested', { configurable: false });
});

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рдореБрдЭреЗ THREE.Scene рдЖрд╕рдкрд╛рд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рд╕рдЪрдореБрдЪ рд╕рдВрдкреВрд░реНрдг рджреГрд╢реНрдп рдЧреНрд░рд╛рдлрд╝ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреА рдЧрдбрд╝рдмрдбрд╝реА рдмрди рдЬрд╛рдПред рдФрд░ рдлрд┐рд░ рдореИрдВ рдЕрднреА рднреА рдореВрд▓ рд╡рд╕реНрддреБ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕реЗ рдЧреБрдЬрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрддреНрддрдо!

рдпрд╛

рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ https://github.com/vuejs/vue/blob/v2.5.16/src/core/observer/index.js#L121
рд╕реЗрдЯ val._isVue = true vue рдирд┐рд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реИред

рдЖрдЬ рдореИрдВ рдПрдХ рдорд╛рдорд▓реЗ рд╕реЗ рдорд┐рд▓рд╛ рдХрд┐, Vue mapbox-gl рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рд╣реБрдИрдВ, рдирдХреНрд╢рд╛ рд╣рд▓реНрдХрд╛ рд╣реЛ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдорд╛рдирдЪрд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдХреЛ Vue рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ map._isVue = true рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред

рдиреЗрд╕реНрдЯреЗрдб рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдЧреБрдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди Maximum call stack size exceeded , рдФрд░ рдпрд╣ рдЕрдзрд┐рдХ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

@Mitroright рдЖрдкрдХреЛ рдЗрд╕реЗ

рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ Vue Arrays рдХреЛ рдХреИрд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИ; рдмрд╕ geoJsonData рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ (рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА рднреА 'рдХреНрдпреЛрдВ' рдореЗрдВ рдЦреЛрд▓рд╛ рдирд╣реАрдВ рдЧрдпрд╛ред)

рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

function makeArrayNonConfigurable(objects)
{
    objects.forEach((obj) =>
    {
        Object.keys(obj).forEach((key) =>
        {
            Object.defineProperty(obj, key, { configurable: false });
        });
    });
}

рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╕реНрддрд░ рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд░рдирд╛ рд╣реИ; Vue рдиреЗрд╕реНрдЯреЗрдб рд╡рд╕реНрддреБ рдЧреБрдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдЧреБрдгреЛрдВ рдкрд░ рд╕рд░рдгреА рдХреЗ рдЕрдВрджрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рджреЗрдЦрдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВред

рдЕрдм, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ 10,000 рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реЗрдХрдВрдб рдпрд╛ рддреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдордВрдерди рд╣реЛрдЧрд╛; рдЗрд╕реЗ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреЗ рдПрдХ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдореИрдВ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ (рдореИрдВ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рджреЗрддрд╛ рд╣реИ), рдФрд░ рдлрд┐рд░ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдХреИрд╢рд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЬреАрд╡рди рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд▓реЛрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВ- рдЕрд╡рдзрд┐ред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рд╡рд┐рд╡рд░рдг рд╣реИ, рдФрд░ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдпрд╣рд╛рдВ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛:
https://medium.com/@deadbeef404/tell -vue-js-to-stop-wasting-time-and-render-faster-7c3f7d2acaab

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдп рдХрд░реЗрдВ:

import Vue from 'vue';

const Observer = (new Vue()).$data.__ob__.constructor;

export function makeNonreactive(obj) {
    obj.__ob__ = new Observer({});
}

рд╣рд╛рдп @Mitorightред рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦ vue-nonreactive рдХреА рд╣рд┐рдореНрдордд рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣рд╛ рд╣реИред рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХреЛрдб рдХреЛ рдкреНрд▓рдЧрдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ( vue-nonreactive рдорд╛рдзреНрдпрдо рд╕реЗ) рдпрд╛ рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВред рд╕рд╛рде рд╣реА, vue-nonreactive рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдареАрдХ рдКрдкрд░ рдЕрджреНрдпрддрди рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЬреИрд╕реЗ рд╣реА vue-devtool рдХреЛ рдлрд┐рд░ рд╕реЗ рдЕрдкрдбреЗрдЯ рдорд┐рд▓рд╛, https://github.com/vuejs/vue/issues/2637#issuecomment -434154442 рдлрд┐рд░ рд╕реЗ vue-devtool рдХреНрд░реИрд╢ рдХрд░ рджреЗрдЧрд╛ред

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ vue-nonreactive рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рди

__ob__ рдХреЛрдИ рднреА рдЧрдгрдирд╛ рдпреЛрдЧреНрдп рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, defineProperty

vue-free.js

import Vue from 'vue'

const Observer = new Vue().$data.__ob__.constructor

function prevent(val) {
    if (val) {
        // Set dummy observer on value
        Object.defineProperty(val, '__ob__', {
            value: new Observer({}),
            enumerable: false,
            configurable: true,
        })
    }

    return val
}

// vue global
Vue.VUE_FREE = prevent

// window
global.VUE_FREE = prevent

// default export
export default prevent

рдЪрд┐рддреНрд░рд╛ рдореИрдВ рдЗрд╕ рдкрд░ рдЕрдкрдирд╛ 2 рд╕реЗрдВрдЯ рдФрд░ рд╕рдорд╛рдзрд╛рди рджреВрдВрдЧрд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рдлреНрд░реАрдЬ рдЕрд╡рдзрд╛рд░рдгрд╛ рдФрд░ рдирдХрд▓реА рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рдореБрджреНрджреЗ рднреА рдереЗред рдореЗрд░рд╛ рдбреЗрдЯрд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЯреНрд░реАрдиреЛрдб рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ, рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ vuex рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИ рдЬрд┐рд╕рдиреЗ рджреЗрдЦреЗ рдЧрдП рдореБрджреНрджреЛрдВ рдореЗрдВ рдПрдХ рдкрд░рдд рдЬреЛрдбрд╝ рджреА рд╣реИред рдореИрдВ рд▓рдЧрд╛рддрд╛рд░ Maximum call stack size exceeded vues object.keys рд▓реВрдк рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдирдХрд▓реА рд╡реАрдПрдирдУрдб рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рдХреЛ рдлреНрд░реАрдЬ рдФрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рди рддреЛ рд░рд┐рдХрд░реНрд╕рди рдореБрджреНрджреЛрдВ рдХреЛ рд░реЛрдХрдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рдерд╛ред

рдореИрдВ рдЕрдВрдд рдореЗрдВ рдкреАрдЫреЗ рд╣рдЯ рдЧрдпрд╛ рдФрд░ рдХреНрд▓рд╛рд╕рд┐рдХ рд░рд┐рд╡реАрд▓рд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ "рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓" рдЧреБрдгреЛрдВ рдХреЛ рд▓рдкреЗрдЯ рд▓рд┐рдпрд╛

рдпрд╣ рд╡рд░реНрдЧ (ES6/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ) рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рд╛рджреЗ рджреГрд╢реНрдп рдореЗрдВ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

import {  first, forEach } from 'lodash';

export class TreeNode {
    internalRefsInstance: () => { getParent: () => TreeNode; setParent: (parent: TreeNode) => void; getChildNodes: () => TreeNode[]; setChildNode: (childNode: TreeNode) => number; };

    get visitedDate(): string | undefined {
        return this._visitedDates.get(this.id) || undefined;
    }

    isSelectedTreeNode: boolean = false;
    showSubheader: boolean = false;
    showHelp: boolean = false;
    treeNodeIconName: string = 'empty';
    childTreeNodeCount: number = 0;

    constructor(public id: string,
        public componentName: string,
        private _visitedDates: Map<string, string>,
        public isActive: boolean = true,
        public nextFlow?: string,
        public prevFlow?: string,
        parent: TreeNode | undefined = undefined) {

        //invoke the internal refs module to create our static instance func to get the values from
        this.internalRefsInstance = this.nonReactiveModule();
        this.internalRefsInstance().setParent(parent);
    }
    nonReactiveModule = () => {
        let _parent: TreeNode | undefined = undefined;
        let _childNodes: TreeNode[] = [];
        const _getParent = (): TreeNode | undefined => {
            return _parent;
        };
        const _setParent = (parent: TreeNode | undefined): void => {
            _parent = parent;
        };
        const _getChildNodes = (): TreeNode[] => {
            return _childNodes || [];
        };
        const _setChildNode = (childNode: TreeNode): number => {
            if (!_childNodes) {
                _childNodes = [];
            }
            _childNodes.push(childNode);
            return _childNodes.length;
        };
        const returnObj = {
            getParent: _getParent,
            setParent: _setParent,
            getChildNodes: _getChildNodes,
            setChildNode: _setChildNode,
        };
        return () => { return returnObj; };
    }

    getParent(): TreeNode | undefined {
        return this.internalRefsInstance().getParent();
    }

    getChildNodes(): TreeNode[] {
        return this.internalRefsInstance().getChildNodes();
    }

    setChildNode(childFlow: TreeNode): void {
        this.childTreeNodeCount = this.internalRefsInstance().setChildNode(childFlow);
    }

    clone(parent: TreeNode | undefined = undefined): TreeNode {
        const newInstance = new TreeNode(this.id, this.componentName, this._visitedDates, this.isActive, this.nextFlow, this.prevFlow, parent);
        newInstance.showHelp = this.showHelp;
        newInstance.showSubheader = this.showSubheader;
        newInstance.isSelectedTreeNode = this.isSelectedTreeNode;
        forEach(this.getChildNodes(), (flow: TreeNode) => {
            newInstance.childTreeNodeCount = newInstance.internalRefsInstance().setChildNode(flow.clone(newInstance));
        });
        return newInstance;
    }

    setVisitedDates(visitedDates: Map<string, string>): void {
        this._visitedDates = visitedDates;
        forEach(this.getChildNodes(), (flow: TreeNode) => {
            flow.setVisitedDates(visitedDates);
        });
    }

    setAsSelected(setParent: boolean = true, setAllFirstChildren: boolean = true): void {
        this.isSelectedTreeNode = true;
        if (setAllFirstChildren) {
            const firstChildFlow = first(this.getChildNodes());
            if (firstChildFlow) {
                firstChildFlow.setAsSelected(false, true);
            }
        }

        if (setParent && this.getParent()) {
            this.getParent()!.setAsSelected(setParent);
        }
    }
    resetSelected(resetChildren: boolean = true): void {
        this.isSelectedTreeNode = false;
        if (resetChildren) {
            forEach(this.getChildNodes(), (flow: TreeNode) => {
                flow.resetSelected(resetChildren);
            });
        }
    }
}

рдЧрдгрдирд╛ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рдкреВрд░реНрдг рд╡рд╕реНрддреБ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдореБрдЭреЗ рдЧрдгрдирд╛ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рднреЗрдЬ рд░рд╣рд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рдЕрдЧрд░ рдореИрдВ рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рд╕рдмрд╕реЗрдЯ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЧрд╣рд░рд╛ рджреНрд░рд╖реНрдЯрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рддрдХ рд▓реЗ рдЬрд╛рдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬреЗрдХреНрд╢рди рдЧреИрд░-рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рд╣рд╛рдпрдХ рдпрд╛ рд╕рдЬрд╛рд╡рдЯреА рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рдлрд╝реАрдбрдмреИрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд╣рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ,

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк https://github.com/vuejs/vue/issues/4384 рдкрд░ рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ

рдирдорд╕реНрддреЗ, рдореИрдВрдиреЗ #10265 рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕ рдкреБрд░рд╛рдиреЗ рдореБрджреНрджреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдереАред
рдореИрдВ рдмрд╕ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдмреВрдд рд╣реЛрдиреЗ рдФрд░ Vue рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд▓рд╛рд╣ рджреА рдЧрдИ рд╕рдорд╛рдзрд╛рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЬрдм рдпрд╣ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП Object.defineProperty рдХреЗ рд╕рд╛рде configurable: false рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реЛрдиреЗ рдореМрдЬреВрджрд╛ рд╕реЗрдЯрд░ / рдЧреЗрдЯрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ)ред
рдХреНрдпрд╛ рдпрд╣ рддрдХрдиреАрдХ рдЕрднреА рднреА Vue 3 рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдпреЛрдЧреНрдп рд╣реЛрдЧреА?
рдзрдиреНрдпрд╡рд╛рдж

@ рдХреЙрд▓рд┐рди-рдЧрд╛рдпреЙрди configurable: false рд╢рд╛рдпрдж _not_ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/vuejs/vue-next/blob/d9c6ff372c10dde8b496ee32f2b9a246edf66a35/packages/reactivity/src/reactive.ts#L159 . рдпрджрд┐ рдпрд╣ Vue 3.x рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╡рд╕реНрддреБ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ API рд╣реЛрдЧрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдирдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд Vue.observable , рдЬрдм рдХреЛрдИ рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд┐рд╕реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╡рд╕реНрддреБ рдкрд░ рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ _new_ рдорд╛рди рджрд╛рдЧреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕реЗ рд╡реИрд╕реЗ рд╣реА рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, _getter_ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЙрдХреНрд╕реА рд▓реМрдЯрд╛рдПрдЧрд╛, рдЕрдЧрд░ рдпрд╣ рдХреИрд╢ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рддреЛ рдПрдХ рдмрдирд╛ рджреЗрдЧрд╛ред

рдПрдХ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐, рдЬрдм рддрдХ рдЖрдк _that_ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЙрдХреНрд╕реА рдкрд░ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдореЗрдореЛрд░реА рд╣реЙрдЧ рдпрд╛ рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд┐рд▓рд┐рдЯреА рдПрдХ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╕реНрддреБ рдЬреЛ рднреА рд╣реЛ - рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд╕рдВрдЧреНрд░рд╣ рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдХреЛрдИ рд╡рд┐рджреЗрд╢реА рд╡рд╕реНрддреБ рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИ, рдЙрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рд▓рд╛рдЧреВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ - _рдХреБрдЫ рдирд╣реАрдВ_ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдЦрд┐рд░ рдЫреБрдЖ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ Vue 3.x рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреНрдпрдерд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред

рдлрд┐рд▓рд╣рд╛рд▓, vue-next рдХреЛрдб рдкреНрд░рддреАрдХ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ Vue рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ https://github.com/vuejs/vue/blob/v2.5.16/src/core/observer/index.js#L121
рд╕реЗрдЯ val._isVue = true vue рдирд┐рд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реИред

рдЖрдЬ рдореИрдВ рдПрдХ рдорд╛рдорд▓реЗ рд╕реЗ рдорд┐рд▓рд╛ рдХрд┐, Vue mapbox-gl рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рд╣реБрдИрдВ, рдирдХреНрд╢рд╛ рд╣рд▓реНрдХрд╛ рд╣реЛ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдорд╛рдирдЪрд┐рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдХреЛ Vue рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ map._isVue = true рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред

рдореИрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рддрдХ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рдореБрдЭреЗ Vue dev рдЯреВрд▓реНрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд╛рдЯ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ _isVue рд╕рдЪ рд╣реИ рдФрд░ рдпрд╣ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ Vue рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рдПрдХрдорд╛рддреНрд░ рд╣реИрдХ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЧрдВрднреАрд░ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдХреЗ рджреЗрдЦрд╛ рд╣реИ, рд╡рд╣ vue-nonreactive рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдУрдкреА рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП V3 рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ?

@HunderlineK рдЙрдерд▓реЗрд░рдл, рдЙрдерд▓рд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓, рдорд╛рд░реНрдХрд░реЙ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

gkiely picture gkiely  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

franciscolourenco picture franciscolourenco  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

finico picture finico  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wufeng87 picture wufeng87  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

julianxhokaxhiu picture julianxhokaxhiu  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ