1. 零散知识点一
    1. node版本控制
    2. React小坑
    3. 对象池模式

零散知识点一

node版本控制

最近搞不同的项目,使用高版本node时遇到npm安装错误,发现是版本问题。为了快速进行项目切换,需要一个版本控制工具。

在网上找到两个方案,“nvm”“n”,我选择了“n”,因为nvm这么多star也没有一个正式的1.0版本并且入门较难、使用复杂。我只是想要切换版本而已,不需要太多花里胡哨。

“n”的使用非常简单

  • 安装

    npm install -g n
  • 安装node指定版本,如果之前已经安装过,输入版本号即可激活

    n <版本号>
  • 切换node指定版本,输入以下命令上下移动,回车切换。需要注意必须至少激活一个node版本,否则报错。

    n
  • 列出可用node版本列表

    n ls

React小坑

在React官方文档中,有一个语法是在组件中可以通过箭头函数去定义方法。

class demo extends React.Component {
    handle = () => {
        console.log(this);
    }
    ...
}

作为一个刚学习React语法的萌新,我被这个语法给误导了,也是因为没仔细阅读文档吧。

这并不是class和箭头函数的ES6语法,只是个实验性的语法,所以但我尝试在非组件的class定义方法的时候,它报错了。

对象池模式

最近在看React的源码,学习到了一个单例模式变种“对象池”模式。

此模式适用于大量实例化复杂可复用的对象的场景,以下是测试的栗子,可以放到控制台去观察一下性能。

const MAX=10000;

function Obj() {
    this.dom=document.createElement('div');
}

function use(obj,callback) {
    callback(obj);
}

function get(obj) {
    return obj.dom;
}

//对象池
function test1() {
    let obj=null;

    for(let i=0;i<MAX;i++) {
        if(!obj) {
            obj = new Obj();
        }

        use(obj,get);
    }
}

//多次new对象
function test2() {
    for(let i=0;i<MAX;i++) {
        const obj=new Obj();

        use(obj,get);
    }
}

(function start() {
    setInterval(() => {
        console.time('test');

        // test1();

        test2();

        console.timeEnd('test');
    },100);
})();

经过测试可以发现,实例化对象越复杂,对象池模式相对于多次实例化对象的性能越好。

但是,当MAX趋于无穷大时,相反多次实例化对象的方法反而性能更好,这可能跟浏览器的本身的垃圾回收机制有关。关于这点,可以通过下面的代码观察。

const MAX=1000000000;

function Obj() {}

function use(obj,callback) {
    callback(obj);
}

function get(obj) {
    return obj;
}

function test1() {
    let obj=null;

    for(let i=0;i<MAX;i++) {
        if(!obj) {
            obj = new Obj();
        }

        use(obj,get);
    }
}

function test2() {
    for(let i=0;i<MAX;i++) {
        const obj=new Obj();

        use(obj,get);
    }
}

(function start() {
    setInterval(() => {
        console.time('test');

        // test1();

        test2();

        console.timeEnd('test');
    },100);
})();

很神奇,也可能是因为我实验的方法不太正确。

关于单例模式还有惰性单例很多变种,由于没有过深的研究,所以先不讨论了哈。