182017.8
13:45:56

互联网上究竟什么是有价值的?是“得到”APP里面那些被传播的思想?是今日头条每日推送的所谓大数据计算?是某些以“聚合真正有价值的内容”为slogan的网站?或许它们都坚持着这些价值观,并且做的不错。但我现在觉得,互联网上,真正有价值的,不随时间流逝而改变价值力的,是数据,更狭隘一点,是数字,是那些网站文章内容中无意间公布的一组数字。这些数字可能是为了论证作者的观点,或者是为了公布自己的调用结果,或者是引用他人的数据吓唬自己的读者,总之,这些数字起码50%是可信的,而那些以传播思想、抒发情感、危言耸听的文章,过一段时间,就没有意义了。

基于这样的想法,我认为目前的百度、谷歌,都以浪费存储资源的方式在提供内容服务,当然他们也在提供数据服务,但是总体而言,占比非常小。一般人搜百度谷歌,大部分是寻找想要看的内容,而他们找到的几十万条内容,阅读之后,按理应该能够解决他们的问题,唯独数据方面,即为欠缺,你搜去年中国房地产负债,得到的是以新闻报道之类的内容,当然,从阅读这些内容中你可以得到一些信息,但是干扰极多,你就像只见冰山一角,而无法知悉全面的愚人一样糊涂。

我想,未来一段时间,自己可以研究一下如何通过网络挖掘,提炼出这种知识。这也是知识管理在技术层面上的思考,是我自己专业范围内的问题。

已有0条回复 回复
102017.8
10:15:02

karma配置中有一个frameworks选项,这个选项的作用是在执行单元测试代码 *.spec.js 文件之前,载入对应的框架,而这些框架都要以插件的形式加入到plugins选项中。比如:

frameworks: ['mocha', 'sinon-chai'],
plugins: [
'karma-mocha',
'karma-sinon-chai',
],

一旦这样做了,那么在你的测试代码中,就不用自己再引入对应的框架,这也是为什么你可以直接在spec.js文件中直接使用describe和it函数。上面这个配置example,你不必再在测试代码中引入mocha、chai和sinon来使用对应的方法,它们的所有api已经被载入到karma的运行环境中了。chai的expect/assert等函数可以直接使用,sinon被作为一个全局变量,它的方法也可以直接使用。

已有0条回复 回复
012017.8
10:24:33

一起使用babel-loader和webpack UglifyJS时,babel会优先处理一遍代码,编译后的代码才进入webpack进行打包和优化操作。在使用扩展运算符...时,不同的情况会进行不同的处理。当在函数参数中使用时,会编译为arguments,而在调用参数时会编译为apply,如下:

function debug(...args) {
  console.log(...args)
}

会被编译为:

function debug() {
  var e
  (e = console).log.apply(null, arguments)
}

这是很奇怪的一种解释方法,为什么要用一个多余的e变量来隔离console和log呢?如果这样编译之后,其结果自然不能被UglifyJS识别,drop_console等选项也就不生效了。解决的办法,就是在调用函数时,直接采用apply。

function debug(...args) {
  console.log.apply(null, args)
}

因为没有使用扩展运算符,所以在编译的时候不会产生上面那种奇怪的分割代码,也就正常被UglifyJS优化了。

已有0条回复 回复
202017.7
17:02:23

UglifyJS里的mangle选项可以设置boolean和object,直观的感觉是,mangle选项让你决定是否把代码里面的变量名进行优化,比如有些变量名很长的,它直接一个字母就替代了,极大的缩短了变量名长度带来的代码量问题,只要在同一个作用域里面,不被外部调用,这种替换非常安全。这一招直接让你的代码缩减巨大,即使你把compress选项设置为false,也能看到显著效果。它还提供更详细的设置选项,你可以选择是否替换toplevel的变量名(默认不替换),也可以有其他选项,具体可以看文档

已有0条回复 回复
132017.7
11:38:33

Promise实例有then方法和catch方法,一般用then来处理成功返回数据时的情况,为了把处理后的数据往下一个then传递,通过return一个新数据的方法,让下一个then的参数等于这个新数据。catch方法更有差别,当你调用一次catch之后,后面如果再继续调用catch方法,它们都会被忽略,因为从概念上也可以认为,catch之后,错误已经被捕获了,为了让后面的catch还能生效,和then的return类似,也可以通过一种方法往下传递,但是不是用return,而是用throw:

new Promise((resolve, reject) => reject('a')).catch(err => {
console.log(err)
throw err
})
.catch(err => console.log(err))

这样就可以使第二个catch也捕获到错误信息,当然,在第一个catch中,可以通过throw不同的err来传递不同的错误信息给下一个catch。

已有0条回复 回复
132017.6
16:51:31

svg里面有时候会用pattern去写一个背景图片,然后在其他元素里面去使用fill: url(#patternId)来调用它,这样就可以实现在一个svg里面定义自己的背景图片,而且还可以使用svg来画这种背景图。

但是有一个问题是,在IE里面,fill调用不支持style属性中使用,比如下面的无效代码:

<rect style="fill: url(#patternId)">

在Chrome下是正常的,但是在IE中使用的时候,没法正常显示,而你需要将fill属性改为attr:

<rect fill="url(#patternId)">

这样才能正常显示你想要的背景图效果。

已有0条回复 回复
222017.5
09:33:59

浏览器线程包括:GUI渲染线程,JavaScript引擎线程,浏览器事件触发线程,定时触发器线程,异步http请求线程。其中,JS引擎线程就是执行JS的主线程,GUI渲染线程跟JS引擎线程是互斥的,不能同时进行,所以当JS陷入死循环的时候,浏览器界面没法进行渲染,而如果渲染消耗了大量资源,JS也没法马上执行。

setTimeout(fun, 0)是一个有趣的现象。这里的知识点是,定时触发器线程和JS主线程是分开的,当执行setTimeout的时候,就是告诉JS主线程,需要被分发到定时触发器线程中去计时等待。线程与线程之间通过消息来通信,当定时触发器线程的某个任务执行完之后,它会把消息发送回主线程,这个消息其实就是回调函数,它把回调函数发回给主线程,但是发回的消息在主线程执行顺序的最末端。所以setTimeout(fun, 0)的效果虽然在时间上看上去是立即执行,但是相对于js程序而已,其实是有一个延时的,起码延时到当前主线程所有任务的最后面。

这好像没有什么用,但是起码在阅读代码的时候不会懵逼。

已有0条回复 回复
182017.5
10:17:43

今天见识到一门新的基于java的语言Kotlin,它有点类似TypeScript,是java的语法糖超集,据阅读到的一些文章看,Kotlin没有对java的实现全部重写。最重要的是,我看到有人指出,Kotlin可以直接编译成JavaScript。也就是说,一门语言,可以根据需要针对不同的应用,进行不同的撰写,然后编译出对应的语言去执行即可。你想在java平台上跑一个应用,用Kotlin写好,编译成java程序,拿去跑就可以了。你想在前端跑,用Kotlin写好,编译成JavaScript拿去跑就好了。我还不知道这种说法,是不是我想象的,一套代码根据需要编译成不同平台版本,但是这确实一点屌。难道现在的新生代语言都是这么玩儿的吗?语言已经突破平台的界限,更拼自己的语法和实现了吗?屌!

已有0条回复 回复
152017.5
12:48:22

利用概念推导、还原事物的形成过程、找共性这3个手段来找到事物的本质,再从这个本质推导基于此事物的上层建筑。——翟志军《即将三十,我不敢说我精通任何一项技术》

已有0条回复 回复
132017.5
13:58:33

一个组件的sass里面,不应该直接引用某个第三方vendor来进行继承,因为当sass compile的时候,会把第三方继承过来的code全部编译过来,导致你的组件编译后的css里面有大量第三方vendor的样式。正确的做法是当你要继承的时候,仅引入第三方的module文件,比如:

@import "~bootstrap-sass/.../_colors.scss";

因为一般的sass项目都会将单独的变量、函数等放在单独的文件中,而这些文件里因为没有实际的样式规则代码,所以在编译之后,它们实际上不会产生最终的css样式。

而如果你在写一个sass项目的时候,也应该遵循这种原则,如果你的组件的sass打算给其他组件去继承,也应该提供一个这样的modules的出口,这样别人只需要继承你的这个modules的出口文件,而不是你的样式出口文件。

已有1条回复 回复