diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e5825bc8..3ec6680c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ + +## [4.2.3](https://github.com/kazupon/vue-i18n/compare/v4.2.2...v4.2.3) (2016-08-23) + + +### :chart_with_upwards_trend: Performance Fixes + +* improve re-rendering cost when change the lang ([0707338](https://github.com/kazupon/vue-i18n/commit/0707338)) + + + ## [4.2.2](https://github.com/kazupon/vue-i18n/compare/v4.2.1...v4.2.2) (2016-08-15) diff --git a/README.md b/README.md index a4e82b5b4..48a1cd894 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Internationalization plugin of Vue.js jsdelivr ```html - + ``` ### NPM diff --git a/dist/vue-i18n.common.js b/dist/vue-i18n.common.js index ae638a5ce..1c448ad5e 100644 --- a/dist/vue-i18n.common.js +++ b/dist/vue-i18n.common.js @@ -1,5 +1,5 @@ /*! - * vue-i18n v4.2.2 + * vue-i18n v4.2.3 * (c) 2016 kazuya kawaguchi * Released under the MIT License. */ @@ -124,49 +124,47 @@ function isPromise(p) { return p && typeof p.then === 'function'; } -function Override (Vue, langVM) { +function Override (Vue, langVM, version) { + function update(vm) { + if (version > 1) { + vm.$forceUpdate(); + } else { + var i = vm._watchers.length; + while (i--) { + vm._watchers[i].update(true); // shallow updates + } + } + } + // override _init var init = Vue.prototype._init; Vue.prototype._init = function (options) { var _this = this; - options = options || {}; - var root = options._parent || options.parent || this; - var lang = root.$lang; + init.call(this, options); - if (lang) { - this.$lang = lang; - } else { + if (!this.$parent) { + // root this.$lang = langVM; + this._langUnwatch = this.$lang.$watch('lang', function (a, b) { + update(_this); + }); } - - this._langUnwatch = this.$lang.$watch('lang', function (a, b) { - update(_this); - }); - - init.call(this, options); }; // override _destroy var destroy = Vue.prototype._destroy; Vue.prototype._destroy = function () { - if (this._langUnwatch) { + if (!this.$parent && this._langUnwatch) { this._langUnwatch(); this._langUnwatch = null; + this.$lang = null; } - this.$lang = null; destroy.apply(this, arguments); }; } -function update(vm) { - var i = vm._watchers.length; - while (i--) { - vm._watchers[i].update(true); // shallow updates - } -} - /** * Observer */ @@ -217,12 +215,8 @@ function Config (Vue, langVM, lang) { }); return function computedGetter() { - if (watcher.dirty) { - watcher.evaluate(); - } - if (Dep.target) { - watcher.depend(); - } + watcher.dirty && watcher.evaluate(); + Dep.target && watcher.depend(); return watcher.value; }; } @@ -844,10 +838,10 @@ function plugin(Vue) { } var lang = 'en'; - setupLangVM(Vue, lang); + Asset(Vue); - Override(Vue, langVM); + Override(Vue, langVM, version); Config(Vue, langVM, lang); Extend(Vue); } @@ -861,7 +855,7 @@ function setupLangVM(Vue, lang) { Vue.config.silent = silent; } -plugin.version = '4.2.2'; +plugin.version = '4.2.3'; if (typeof window !== 'undefined' && window.Vue) { window.Vue.use(plugin); diff --git a/dist/vue-i18n.js b/dist/vue-i18n.js index 21903bfbd..744c7d3ee 100644 --- a/dist/vue-i18n.js +++ b/dist/vue-i18n.js @@ -1,5 +1,5 @@ /*! - * vue-i18n v4.2.2 + * vue-i18n v4.2.3 * (c) 2016 kazuya kawaguchi * Released under the MIT License. */ @@ -128,49 +128,47 @@ return p && typeof p.then === 'function'; } - function Override (Vue, langVM) { + function Override (Vue, langVM, version) { + function update(vm) { + if (version > 1) { + vm.$forceUpdate(); + } else { + var i = vm._watchers.length; + while (i--) { + vm._watchers[i].update(true); // shallow updates + } + } + } + // override _init var init = Vue.prototype._init; Vue.prototype._init = function (options) { var _this = this; - options = options || {}; - var root = options._parent || options.parent || this; - var lang = root.$lang; + init.call(this, options); - if (lang) { - this.$lang = lang; - } else { + if (!this.$parent) { + // root this.$lang = langVM; + this._langUnwatch = this.$lang.$watch('lang', function (a, b) { + update(_this); + }); } - - this._langUnwatch = this.$lang.$watch('lang', function (a, b) { - update(_this); - }); - - init.call(this, options); }; // override _destroy var destroy = Vue.prototype._destroy; Vue.prototype._destroy = function () { - if (this._langUnwatch) { + if (!this.$parent && this._langUnwatch) { this._langUnwatch(); this._langUnwatch = null; + this.$lang = null; } - this.$lang = null; destroy.apply(this, arguments); }; } - function update(vm) { - var i = vm._watchers.length; - while (i--) { - vm._watchers[i].update(true); // shallow updates - } - } - /** * Observer */ @@ -221,12 +219,8 @@ }); return function computedGetter() { - if (watcher.dirty) { - watcher.evaluate(); - } - if (Dep.target) { - watcher.depend(); - } + watcher.dirty && watcher.evaluate(); + Dep.target && watcher.depend(); return watcher.value; }; } @@ -848,10 +842,10 @@ } var lang = 'en'; - setupLangVM(Vue, lang); + Asset(Vue); - Override(Vue, langVM); + Override(Vue, langVM, version); Config(Vue, langVM, lang); Extend(Vue); } @@ -865,7 +859,7 @@ Vue.config.silent = silent; } - plugin.version = '4.2.2'; + plugin.version = '4.2.3'; if (typeof window !== 'undefined' && window.Vue) { window.Vue.use(plugin); diff --git a/dist/vue-i18n.min.js b/dist/vue-i18n.min.js index a22fd7c8e..0b24eb477 100644 --- a/dist/vue-i18n.min.js +++ b/dist/vue-i18n.min.js @@ -1,6 +1,6 @@ /*! - * vue-i18n v4.2.2 + * vue-i18n v4.2.3 * (c) 2016 kazuya kawaguchi * Released under the MIT License. */ -!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):n.VueI18n=t()}(this,function(){"use strict";function n(n,t){window.console&&(console.warn("[vue-i18n] "+n),t&&console.warn(t.stack))}function t(t){t.locale=function(t,r,o){return void 0===r?m[t]:void(null===r?(m[t]=void 0,delete m[t]):e(t,r,function(e){e?(m[t]=e,o&&o()):n("failed set `"+t+"` locale")}))}}function e(n,t,e){var o=this;"object"===("undefined"==typeof t?"undefined":_["typeof"](t))?e(t):!function(){var n=t.call(o);"function"==typeof n?n.resolved?e(n.resolved):n.requested?n.pendingCallbacks.push(e):!function(){n.requested=!0;var t=n.pendingCallbacks=[e];n(function(e){n.resolved=e;for(var r=0,o=t.length;o>r;r++)t[r](e)},function(){e()})}():r(n)&&n.then(function(n){e(n)},function(){e()})["catch"](function(n){console.error(n),e()})}()}function r(n){return n&&"function"==typeof n.then}function o(n,t){var e=n.prototype._init;n.prototype._init=function(n){var r=this;n=n||{};var o=n._parent||n.parent||this,u=o.$lang;u?this.$lang=u:this.$lang=t,this._langUnwatch=this.$lang.$watch("lang",function(n,t){i(r)}),e.call(this,n)};var r=n.prototype._destroy;n.prototype._destroy=function(){this._langUnwatch&&(this._langUnwatch(),this._langUnwatch=null),this.$lang=null,r.apply(this,arguments)}}function i(n){for(var t=n._watchers.length;t--;)n._watchers[t].update(!0)}function u(n){if(!A){var t=n.$watch("__watcher__",function(n){});A=n._watchers[0].constructor,t()}return A}function a(n){return $||($=n._data.__ob__.dep.constructor),$}function c(n,t,e){function r(n,t){var e=new i(t,n,null,{lazy:!0});return function(){return e.dirty&&e.evaluate(),c.target&&e.depend(),e.value}}var o=n.util.bind,i=u(t),c=a(t);Object.defineProperty(n.config,"lang",{enumerable:!0,configurable:!0,get:r(function(){return t.lang},t),set:o(function(n){t.lang=n},t)}),j=e,Object.defineProperty(n.config,"fallbackLang",{enumerable:!0,configurable:!0,get:function(){return j},set:function(n){j=n}})}function l(n){function t(n){for(var t=arguments.length,r=Array(t>1?t-1:0),o=1;t>o;o++)r[o-1]=arguments[o];return 1===r.length&&"object"===_["typeof"](r[0])&&(r=r[0]),r&&r.hasOwnProperty||(r={}),n.replace(O,function(t,o,i,u){var a=void 0;return"{"===n[u-1]&&"}"===n[u+t.length]?i:(a=e(r,i)?r[i]:null,null===a||void 0===a?"":a)})}var e=n.util.hasOwn;return t}function f(n){return E.test(n)}function s(n){var t=n.charCodeAt(0),e=n.charCodeAt(n.length-1);return t!==e||34!==t&&39!==t?n:n.slice(1,-1)}function d(n){if(void 0===n)return"eof";var t=n.charCodeAt(0);switch(t){case 91:case 93:case 46:case 34:case 39:case 48:return n;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return t>=97&&122>=t||t>=65&&90>=t?"ident":t>=49&&57>=t?"number":"else"}function v(n){var t=n.trim();return"0"===n.charAt(0)&&isNaN(n)?!1:f(t)?s(t):"*"+t}function h(n){function t(){var t=n[r+1];return o===L&&"'"===t||o===I&&'"'===t?(r++,a="\\"+t,p[C](),!0):void 0}var e=[],r=-1,o=N,i=0,u=void 0,a=void 0,c=void 0,l=void 0,f=void 0,s=void 0,h=void 0,p=[];for(p[P]=function(){void 0!==c&&(e.push(c),c=void 0)},p[C]=function(){void 0===c?c=a:c+=a},p[S]=function(){p[C](),i++},p[U]=function(){if(i>0)i--,o=z,p[C]();else{if(i=0,c=v(c),c===!1)return!1;p[P]()}};null!=o;)if(r++,u=n[r],"\\"!==u||!t()){if(l=d(u),h=D[o],f=h[l]||h["else"]||B,f===B)return;if(o=f[0],s=p[f[1]],s&&(a=f[2],a=void 0===a?u:a,s()===!1))return;if(o===Z)return e.raw=n,e}}function p(n){var t=k[n];return t||(t=h(n),t&&(k[n]=t)),t}function g(n){function t(n){if(null===n||void 0===n)return!0;if(Array.isArray(n)){if(n.length>0)return!1;if(0===n.length)return!0}else if(i(n))for(var t in n)if(u(n,t))return!1;return!0}function e(n,e){if(!o(n))return null;var r=p(e);if(t(r))return null;for(var i=r.length,u=null,a=n,c=0;i>c;){var l=a[r[c]];if(void 0===l){a=null;break}a=l,c++}return u=a}var r=n.util,o=r.isObject,i=r.isPlainObject,u=r.hasOwn;return e}function y(n){function t(){for(var t=arguments.length,e=Array(t),r=0;t>r;r++)e[r]=arguments[r];var o=n.config.lang,i=n.config.fallbackLang;return 1===e.length?c(e[0])||Array.isArray(e[0])?e=e[0]:"string"==typeof e[0]&&(o=e[0]):2===e.length&&("string"==typeof e[0]&&(o=e[0]),(c(e[1])||Array.isArray(e[1]))&&(e=e[1])),{lang:o,fallback:i,params:e}}function e(n,t,e){if(!n)return null;var r=d(n,t)||n[t];return r?e?s(r,e):r:null}function r(n,t,r,o,i){var u=null;return(u=e(n(t),o,i))?u:(u=e(n(r),o,i),u?u:null)}function o(n){return n}function i(t){return n.locale(t)}function u(n){return this.$options.locales[n]}var a=n.util,c=a.isObject,f=a.bind,s=l(n),d=g(n);return n.t=function(n){for(var e=arguments.length,u=Array(e>1?e-1:0),a=1;e>a;a++)u[a-1]=arguments[a];if(!n)return"";var c=t.apply(void 0,u),l=c.lang,f=c.fallback,s=c.params;return r(i,l,f,n,s)||o(n)},n.prototype.$t=function(n){if(!n)return"";for(var e=arguments.length,a=Array(e>1?e-1:0),c=1;e>c;c++)a[c-1]=arguments[c];var l=t.apply(void 0,a),s=l.lang,d=l.fallback,v=l.params,h=null;return this.$options.locales&&(h=r(f(u,this),s,d,n,v))?h:r(i,s,d,n,v)||o(n)},n}function b(n){var e=(arguments.length<=1||void 0===arguments[1]?{}:arguments[1],n.version&&Number(n.version.split(".")[0])||-1,"en");w(n,e),t(n),o(n,F),c(n,F,e),y(n)}function w(n,t){var e=n.config.silent;n.config.silent=!0,F||(F=new n({data:{lang:t}})),n.config.silent=e}var _={};_["typeof"]="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol?"symbol":typeof n};var m=Object.create(null),A=void 0,$=void 0,j=void 0,O=/(%|)\{([0-9a-zA-Z_]+)\}/g,k=Object.create(null),C=0,P=1,S=2,U=3,N=0,V=1,q=2,x=3,z=4,L=5,I=6,Z=7,B=8,D=[];D[N]={ws:[N],ident:[x,C],"[":[z],eof:[Z]},D[V]={ws:[V],".":[q],"[":[z],eof:[Z]},D[q]={ws:[q],ident:[x,C]},D[x]={ident:[x,C],0:[x,C],number:[x,C],ws:[V,P],".":[q,P],"[":[z,P],eof:[Z,P]},D[z]={"'":[L,C],'"':[I,C],"[":[z,S],"]":[V,U],eof:B,"else":[z,C]},D[L]={"'":[z,C],eof:B,"else":[L,C]},D[I]={'"':[z,C],eof:B,"else":[I,C]};var E=/^\s?(true|false|-?[\d\.]+|'[^']*'|"[^"]*")\s?$/,F=void 0;return b.version="4.2.2","undefined"!=typeof window&&window.Vue&&window.Vue.use(b),b}); \ No newline at end of file +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):n.VueI18n=t()}(this,function(){"use strict";function n(n,t){window.console&&(console.warn("[vue-i18n] "+n),t&&console.warn(t.stack))}function t(t){t.locale=function(t,r,o){return void 0===r?_[t]:void(null===r?(_[t]=void 0,delete _[t]):e(t,r,function(e){e?(_[t]=e,o&&o()):n("failed set `"+t+"` locale")}))}}function e(n,t,e){var o=this;"object"===("undefined"==typeof t?"undefined":w["typeof"](t))?e(t):!function(){var n=t.call(o);"function"==typeof n?n.resolved?e(n.resolved):n.requested?n.pendingCallbacks.push(e):!function(){n.requested=!0;var t=n.pendingCallbacks=[e];n(function(e){n.resolved=e;for(var r=0,o=t.length;o>r;r++)t[r](e)},function(){e()})}():r(n)&&n.then(function(n){e(n)},function(){e()})["catch"](function(n){console.error(n),e()})}()}function r(n){return n&&"function"==typeof n.then}function o(n,t,e){function r(n){if(e>1)n.$forceUpdate();else for(var t=n._watchers.length;t--;)n._watchers[t].update(!0)}var o=n.prototype._init;n.prototype._init=function(n){var e=this;o.call(this,n),this.$parent||(this.$lang=t,this._langUnwatch=this.$lang.$watch("lang",function(n,t){r(e)}))};var i=n.prototype._destroy;n.prototype._destroy=function(){!this.$parent&&this._langUnwatch&&(this._langUnwatch(),this._langUnwatch=null,this.$lang=null),i.apply(this,arguments)}}function i(n){if(!m){var t=n.$watch("__watcher__",function(n){});m=n._watchers[0].constructor,t()}return m}function u(n){return A||(A=n._data.__ob__.dep.constructor),A}function a(n,t,e){function r(n,t){var e=new a(t,n,null,{lazy:!0});return function(){return e.dirty&&e.evaluate(),c.target&&e.depend(),e.value}}var o=n.util.bind,a=i(t),c=u(t);Object.defineProperty(n.config,"lang",{enumerable:!0,configurable:!0,get:r(function(){return t.lang},t),set:o(function(n){t.lang=n},t)}),$=e,Object.defineProperty(n.config,"fallbackLang",{enumerable:!0,configurable:!0,get:function(){return $},set:function(n){$=n}})}function c(n){function t(n){for(var t=arguments.length,r=Array(t>1?t-1:0),o=1;t>o;o++)r[o-1]=arguments[o];return 1===r.length&&"object"===w["typeof"](r[0])&&(r=r[0]),r&&r.hasOwnProperty||(r={}),n.replace(j,function(t,o,i,u){var a=void 0;return"{"===n[u-1]&&"}"===n[u+t.length]?i:(a=e(r,i)?r[i]:null,null===a||void 0===a?"":a)})}var e=n.util.hasOwn;return t}function f(n){return D.test(n)}function l(n){var t=n.charCodeAt(0),e=n.charCodeAt(n.length-1);return t!==e||34!==t&&39!==t?n:n.slice(1,-1)}function s(n){if(void 0===n)return"eof";var t=n.charCodeAt(0);switch(t){case 91:case 93:case 46:case 34:case 39:case 48:return n;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return t>=97&&122>=t||t>=65&&90>=t?"ident":t>=49&&57>=t?"number":"else"}function d(n){var t=n.trim();return"0"===n.charAt(0)&&isNaN(n)?!1:f(t)?l(t):"*"+t}function v(n){function t(){var t=n[r+1];return o===z&&"'"===t||o===L&&'"'===t?(r++,a="\\"+t,p[k](),!0):void 0}var e=[],r=-1,o=S,i=0,u=void 0,a=void 0,c=void 0,f=void 0,l=void 0,v=void 0,h=void 0,p=[];for(p[C]=function(){void 0!==c&&(e.push(c),c=void 0)},p[k]=function(){void 0===c?c=a:c+=a},p[U]=function(){p[k](),i++},p[P]=function(){if(i>0)i--,o=x,p[k]();else{if(i=0,c=d(c),c===!1)return!1;p[C]()}};null!=o;)if(r++,u=n[r],"\\"!==u||!t()){if(f=s(u),h=B[o],l=h[f]||h["else"]||Z,l===Z)return;if(o=l[0],v=p[l[1]],v&&(a=l[2],a=void 0===a?u:a,v()===!1))return;if(o===I)return e.raw=n,e}}function h(n){var t=O[n];return t||(t=v(n),t&&(O[n]=t)),t}function p(n){function t(n){if(null===n||void 0===n)return!0;if(Array.isArray(n)){if(n.length>0)return!1;if(0===n.length)return!0}else if(i(n))for(var t in n)if(u(n,t))return!1;return!0}function e(n,e){if(!o(n))return null;var r=h(e);if(t(r))return null;for(var i=r.length,u=null,a=n,c=0;i>c;){var f=a[r[c]];if(void 0===f){a=null;break}a=f,c++}return u=a}var r=n.util,o=r.isObject,i=r.isPlainObject,u=r.hasOwn;return e}function g(n){function t(){for(var t=arguments.length,e=Array(t),r=0;t>r;r++)e[r]=arguments[r];var o=n.config.lang,i=n.config.fallbackLang;return 1===e.length?f(e[0])||Array.isArray(e[0])?e=e[0]:"string"==typeof e[0]&&(o=e[0]):2===e.length&&("string"==typeof e[0]&&(o=e[0]),(f(e[1])||Array.isArray(e[1]))&&(e=e[1])),{lang:o,fallback:i,params:e}}function e(n,t,e){if(!n)return null;var r=d(n,t)||n[t];return r?e?s(r,e):r:null}function r(n,t,r,o,i){var u=null;return(u=e(n(t),o,i))?u:(u=e(n(r),o,i),u?u:null)}function o(n){return n}function i(t){return n.locale(t)}function u(n){return this.$options.locales[n]}var a=n.util,f=a.isObject,l=a.bind,s=c(n),d=p(n);return n.t=function(n){for(var e=arguments.length,u=Array(e>1?e-1:0),a=1;e>a;a++)u[a-1]=arguments[a];if(!n)return"";var c=t.apply(void 0,u),f=c.lang,l=c.fallback,s=c.params;return r(i,f,l,n,s)||o(n)},n.prototype.$t=function(n){if(!n)return"";for(var e=arguments.length,a=Array(e>1?e-1:0),c=1;e>c;c++)a[c-1]=arguments[c];var f=t.apply(void 0,a),s=f.lang,d=f.fallback,v=f.params,h=null;return this.$options.locales&&(h=r(l(u,this),s,d,n,v))?h:r(i,s,d,n,v)||o(n)},n}function y(n){var e=(arguments.length<=1||void 0===arguments[1]?{}:arguments[1],n.version&&Number(n.version.split(".")[0])||-1),r="en";b(n,r),t(n),o(n,E,e),a(n,E,r),g(n)}function b(n,t){var e=n.config.silent;n.config.silent=!0,E||(E=new n({data:{lang:t}})),n.config.silent=e}var w={};w["typeof"]="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol?"symbol":typeof n};var _=Object.create(null),m=void 0,A=void 0,$=void 0,j=/(%|)\{([0-9a-zA-Z_]+)\}/g,O=Object.create(null),k=0,C=1,U=2,P=3,S=0,N=1,V=2,q=3,x=4,z=5,L=6,I=7,Z=8,B=[];B[S]={ws:[S],ident:[q,k],"[":[x],eof:[I]},B[N]={ws:[N],".":[V],"[":[x],eof:[I]},B[V]={ws:[V],ident:[q,k]},B[q]={ident:[q,k],0:[q,k],number:[q,k],ws:[N,C],".":[V,C],"[":[x,C],eof:[I,C]},B[x]={"'":[z,k],'"':[L,k],"[":[x,U],"]":[N,P],eof:Z,"else":[x,k]},B[z]={"'":[x,k],eof:Z,"else":[z,k]},B[L]={'"':[x,k],eof:Z,"else":[L,k]};var D=/^\s?(true|false|-?[\d\.]+|'[^']*'|"[^"]*")\s?$/,E=void 0;return y.version="4.2.3","undefined"!=typeof window&&window.Vue&&window.Vue.use(y),y}); \ No newline at end of file diff --git a/package.json b/package.json index 3ffea10cd..45f9a1e33 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-i18n", "description": "Internationalization plugin for Vue.js", - "version": "4.2.2", + "version": "4.2.3", "author": { "name": "kazuya kawaguchi", "email": "kawakazu80@gmail.com" diff --git a/src/index.js b/src/index.js index ea3d2b763..c655c6af5 100644 --- a/src/index.js +++ b/src/index.js @@ -47,7 +47,7 @@ function setupLangVM (Vue, lang) { Vue.config.silent = silent } -plugin.version = '4.2.2' +plugin.version = '4.2.3' export default plugin