你好获取登录信息中




首页 主站 文章列表 分类列表
文章列表更多

2020-08-22 11:34:10

有个小孩,在父母的陪伴下,在迷宫中探索着。迷宫中有些台阶,小孩每次通过都会摔跟头,长此以往,小孩开始对这些台阶有了厌恶的心里。但是小孩对这个迷宫仍然充满好奇,仍然在孜孜不倦的探索着。小孩在慢慢长大,父母逐渐跟不上小孩的步伐。小孩开始有了一个人探索的时间,在这些时间里,小孩只要有其他路可以选择,就绝对不会碰有台阶的路。甚至他会避开陡坡。

时间飞逝,转眼小孩已是少年。父母已经完全不能跟上他的步伐了,他也在路上认识了许多小伙伴。能跟着这些小伙伴一起探索迷宫,一起休息,少年感觉十分愉快。但是并不是每个人对这个事情那么愉快,他们不希望那些走的慢的影响到走的快的人的步伐。于是在某个月黑风高的夜晚,他和他的小伙伴被分隔开了,在黑暗之中,少年或许是因为过台阶时不利又或许是因为根本就绕过台了台阶但走了一条更远的路,他终究没能和他曾经的伙伴走在一起,现在在他身边的几乎都是未曾相识的人。当然,也还是有曾经那群伙伴中的也出现在这了,但是,曾经他那些有说有笑的伙伴却都在篱笆另一侧。每当附近没人时,他就会伤心的哭,但是他并没有意识到这场分别意味着啥。他渐渐发现偶尔在篱笆矮下去的拐角,他偶尔还能和曾经的那些小伙伴见面;但是他也发现新的小伙伴前进的速度都挺慢的,甚至有许多放弃前进的。少年不愿和他们为伍,但是他也不愿意孤身前进。于是当看到拐角时,少年就会跑过去试着和曾经的小伙伴谈笑;而其他时间,或许是因为奔跑得太累亦或是想等个人一同前进,也或许因为他不想通过哪些台阶和陡坡,感觉要长期跟上以前的小伙伴已经很难了,虽然他还在向前走着,但是脚步却慢了不少。终于,他跟后面那些走的比较快一点的到了一起。

但是这样的日子持续不了太久,他们在一个路口再一次分别,他们已经错过了更近的路,只能选择自己更愿意去走的路了。于是,在新的道路上,少年认识了许多跟他一样不愿走台阶或是陡坡的人,尽管大家嘴上互相勉励着,但是真正碰到台阶或是陡坡的时候,通过的人总是那么少,大家实际上仍然更多的时候在通过自己更熟练的地形。与此同时,少年也已经成为青年,他对迷宫本身的兴趣已经开始逐渐减退,他已经知道,这个迷宫是永远也走不出去的,他要做的收集迷宫中的吃的,至少有一天自己走不动路了也不会饿死。他所看中的是一块较大的饼和一块中等大小的饼。那块较大的饼在迷宫更深的地方,距离是如此遥远,并且路线也更为复杂。他并不想,让自己太累,何况边上和后面还有那么多人,他们甚至可能连更小的饼都吃不到,于是他选择了那块中等大小的饼,倘若有可能,就再去拿那个更大的饼。当然,这段路对他来说,虽不是触手可及,但也并非那么遥远,只是他不走台阶不爬坡的习惯让他绕了一大段路。不过考虑其他人也同样在绕路,因此他似乎仍然走在前面。于是他在一边向前走着,一边探索着迷宫中其他花花草草,或许有一天,这些花花草草能做成调料——枯燥的迷宫还是需要有点调节。

终于有一天,他拿到了这个饼,虽然不是更大的那个,甚至还撒了一点,但是他至少还算愉快的拿到了这个饼。他等这一天很久了,虽然他也眼馋更大的饼,但是他实在是等不及了。他拿着这块饼,沾着自制的调料美美的吃了起来,一切看上去都是十分美好的。可是日复一日的吃着相同的口味总有一天会腻,他需要去换一些其他调料来解决问题。而这时他才发现,自己材料并不都能转化成调料或者食品,而能做出来的那些,虽然味道不错,但是比起市场上那些调料却又缺少包装,这导致他要换更多更好的调料变得非常艰难。长此以往,他开始有点厌倦了眼下的生活。

有一天,他遇到了一个已经吃到更大的蛋糕的人,但是那个人仍然在向前探索着。他拿手中的饼换了一些蛋糕来品尝,但可惜,饼实在太小,换不来更多的蛋糕,而别人还要继续前进。见过真实存在的蛋糕之后,他便觉得空气中偶尔飘来的山珍海味的气息也来自迷宫之中,只是在某个角落等着人去发现,手中的饼已是味同爵蜡。于是他想,他为啥就不能为了更好的目标继续前进呢?细细想来,他曾经也不是拿不到那张更大的饼,这或许需要一点运气,但是他曾经也有这个能力。而那些冲在更前面的,却也未必走得比他快,也未必休息得比他少多少。诚然,这中间不乏一些出生就在更前面的,但是如果不肯跨越陡坡和台阶,或是其他情况而绕路的话,这便会比别人慢很多,如果过多的贪恋休息的话,更是只会停滞不前。于是他便想继续探索,而他前进的动力已经不再是为了探索本身,而是寻找更好的食物。虽然他对那块更大的饼有了些怨念,但是他已经不需要更大的饼了,也来不及去拿了。他只能转身走边上的小路去探索其他东西。这边的地形更为复杂,也不像之前有人或者路标能指明方向,即使偶尔能见到一处路牌,几乎也都是在灌木或草丛之中,这中间,既有真正的方向,也有纯属而作剧的玩笑。而他探索迷宫的能力也已经随着时间流逝消退了不少——即使是以前能轻松通过的平路也让他气喘吁吁。而路线上更是一次又一次拐进同一个死胡同,而这种试错的成本却又随着时间推移逐渐增加。他不敢贸然前进,独自向前可真不是那么容易的。他希望能有个灯来照亮前进的路,可是他没有;他希望有束光能指出其他食物的位置,可是这些食物的位置本就是随机的;他希望有个人能一同前进,一起面对路上的困难,可是大家却不得不各自选择自己的路。或许有一天……,也或许……。

简单的化学反应自动配平

2020-08-15 15:35:46

前言

高中时有做化学反应方程自动配平的想法,当时其实已经想到了用方程求解,当时并没有好的方法去求解,所以鸽了。之后也没有再学习化学了,所以就也没怎么想过这事了,前几天忽然想起这事来于是就着手做了一个,用了线性代数的东西,不过也不是很难所以讲讲原理.成品测试地址点我

化学反应的原子守恒

对于一个化学反应来说,无论如何反应,反应方程两边的各种原子数目都是相同的,例:

2KMnO4=加热=K2Mn04+MnO2+O2↑

左侧有2个K,右侧就一定也有2个,左右2个Mn,右侧也是2个,左侧8个O,右侧也是8个。

如果我们依次设这4种分子前面的系数为x1、x2、x3和x4的话,则有:

x1KMnO4=加热=x2K2Mn04+x3MnO2+x4O2↑

然后得到方程组:

  1. x1=x2*2 ①(K守恒)
  2. x1=x2+x3 ②(Mn守恒)
  3. x1*4=x2*4+x3*2+x4*2 ③(O守恒)

通过解方程的方式不难判断出各项两两之间的比值,我们只要求出最简整数比就可以得到各部分的系数了。

比如②式减①式可以得到0=x3-x2

  1. x3=x2 ④

将①式和④式带入③式可以得到x2*2*4=x2*4+x2*2+x4*2,即:

  1. x4=x2

然后取x2=1得

  1. x1=2 x2=1 x3=1 x4=1

从而方程得到配平

通用的线性方程组求解——线性代数

上面的计算是需要通过观察的方式来解方程,但是计算机只是机器,它并不能做到真正意义上的观察(所谓机器学习,只是通过大量训练数据,判断出每个条件下输出啥的可能性最高,这个过程跟人的条件反射类似,所以也叫神经网络,但实际上机器并不会去理解这个条件的含义以及这么做会发生啥),因此我们需要找到一种通用的解方程的方式。

首先我们可以看到,我们的方程中有些缺少的项,如果我们要做通用的计算方法,这些空出来的部分显然会对我们造成困扰,所以我们需要把这些确实的项补上,于是得到

  1. x1*1=x2*2+x3*0+x4*0
  2. x1*1=x2*1+x3*1+x4*0
  3. x1*4=x2*4+x3*2+x4*2

好了,这就是一个一个比较标准的形式了,但是为了统一处理,我们还需要进一步转换,将所有数移动到方程的一侧,让另一次等于0

  1. x1*(-1)+x2*2+x3*0+x4*0+0=0
  2. x1*(-1)+x2*1+x3*1+x4*0+0=0
  3. x1*(-4)+x2*4+x3*2+x4*2+0=0

好了,这个方程就整理结束了,它的每个式子都是一模一样的形式的,每一项也都是一样的一个系数了。但是呢,计算机仍然不能理解x1-xn这种未知变量,反正我们计算的时候要的也就是前面那个系数而已,未知变量是啥符号本身我们不需要关心,所以我们也把它省略掉于是得到这样一个东西

  1. -1 2 0 0 0
  2. -1 1 1 0 0
  3. -4 4 2 2 0

好了,这就包含了我们方程中的所有信息了,但是,它只是一堆数字,处理数字自然就是计算机拿手的活了。而这个东西就是一个矩阵。所谓线性代数,本质上核心就是把多元一次方程(一次方程也就是所谓线性,当其中一个未知量变化时,函数图像是一条直线,所以叫做线性,而二次方程或者其他的方程对应函数图像是抛物线或者其他曲线)。接下来我们就是要解这个方程了。

我们正常解方程,除了直接把已知的变量表达式带进去以外,还有两式相加减、等式两边同时乘以某个数的操作,那么这些操作在线性代数中仍然存在。比如我们让第一个式子方程两边同时乘-1,可以得到:

  1. 1 -2 0 0 0 x1*(+1)+x2*(-2)+x3*0+x4*0+0=0
  2. -1 1 1 0 0 x1*(-1)+x2*(+1)+x3*1+x4*0+0=0
  3. -4 4 2 2 0 x1*(-4)+x2*(+4)+x3*2+x4*2+0=0

这样,我们第一行式子就算处理完了,我们已经得出1个x1和其他变量的关系了,接下来,我们希望得到x2的关系,但是,这时候把x1带进来就是一个不明智的选择了,因为我需要x1的时候我会需要知道x2,然后我需要x2的时候我又得知道x1,就死循环了,因此我们接下来要得到一个不包含x1的式子。但是矩阵这个行列还是得对齐的啊,那么我们其实需要的是让x1的系数变成0就好了。第一行已经用了,那我们自然就会想选第二行来操作。第二行的x1系数是-1,那么只要我们第一行正好已经求出了一个x1的关系,那么我们为了得到0,我们就应该加上一个第一行,或者更通用一点,我现在是多了-1个第1行,那我就减去-1个第一行这样。然后得到

  1. 1 -2 0 0 0 x1*(+1)+x2*(-2)+x3*0+x4*0+0=0
  2. 0 -1 1 0 0 x1*(+0)+x2*(-1)+x3*1+x4*0+0=0
  3. -4 4 2 2 0 x1*(-4)+x2*(+4)+x3*2+x4*2+0=0

这样x2的关系就有了,并且还不包含x1了。但是这个系数是-1,我们不太满意,这会给之后的计算造成困扰,我们应该把它和x1一样变成单位数量1的表示,于是,方程两边同时乘-1得到

  1. 1 -2 0 0 0 x1*(+1)+x2*(-2)+x3*(+0)+x4*0+0=0
  2. 0 1 -1 0 0 x1*(+0)+x2*(+1)+x3*(-1)+x4*0+0=0
  3. -4 4 2 2 0 x1*(-4)+x2*(+4)+x3*(+2)+x4*2+0=0

好了,我们还有最后一行数据,同样的方法,先把里面的x1消掉(即减去-4个第一行)得到

  1. 1 -2 0 0 0 x1*(+1)+x2*(-2)+x3*(+0)+x4*0+0=0
  2. 0 1 -1 0 0 x1*(+0)+x2*(+1)+x3*(-1)+x4*0+0=0
  3. 0 -4 2 2 0 x1*(+0)+x2*(-4)+x3*(+2)+x4*2+0=0

但是这仍然不是一个满意的结果,里面包含了-4个x2,那么我们继续减去-4个第二行得到

  1. 1 -2 0 0 0 x1*(+1)+x2*(-2)+x3*(+0)+x4*0+0=0
  2. 0 1 -1 0 0 x1*(+0)+x2*(+1)+x3*(-1)+x4*0+0=0
  3. 0 0 -2 2 0 x1*(+0)+x2*(+0)+x3*(-2)+x4*2+0=0

然后除以-2让它得到一个单位的x3的表示

  1. 1 -2 0 0 0 x1*(+1)+x2*(-2)+x3*(+0)+x4*(+0)+0=0
  2. 0 1 -1 0 0 x1*(+0)+x2*(+1)+x3*(-1)+x4*(+0)+0=0
  3. 0 0 1 -1 0 x1*(+0)+x2*(+0)+x3*(+1)+x4*(-1)+0=0

好了,我们现在3行数据全部处理完毕了,如果有更多的行,我们只要按相同的方法做就行了。

但是似乎,这是一个4元方程,我们3个方程是求不出唯一解的。怎么得出反应方程的系数稍后再谈,先留着你们想想。如果你仔细观察的话就会发现这种格式下行数应该等于列数-1的时候我们才能求出xn的值,然后代入第n-1行,求出xn-1,然后一直求到x1。这个行数就是矩阵的 秩 。当矩阵的秩小于n时,我们是缺少式子的,我们能找到他们之间的关系,但是不能算出一个具体的数。只有秩等于n时才会有唯一解。

未知变量和等式关系数量相同就一定能解吗?

答案显然是不行。我们应该都有见过这个一个方程:

  1. x=y
  2. y=z
  3. z=x

似乎是有3个不重复的式子,但是仔细想想前两条其实是能推出第三条的,这条是无意义的式子,在线性代数中表现如下

  1. 1 -1 0 0
  2. 0 1 -1 0
  3. -1 0 1 0

第一二行显然不需要处理(或者说处理完结果也是一样,除以1是不会改变的,加上一个被0乘的数字也就是加0,也不会变),然后就是第三行,按我们之前的加-1个第一行。看好了,这跟第二行是不是只差个符号?我们把它用之前的方法继续处理

  1. 1 -1 0 0
  2. 0 1 -1 0
  3. 0 -1 1 0

看好了,这跟第二行是不是只差个符号?我们把它用之前的方法继续处理

  1. 1 -1 0 0
  2. 0 1 -1 0
  3. 0 0 0 0

然后就会发现这一行数据全部被消掉了,各项均为0了。那么这一行也是没有意义的,如果计算时碰到这样的行,那就应该把这一行删掉然后用下一行代替这一行的位置重新计算了。不过这里没有下一行了,所以这个方程的解也不唯一,算秩的时候也要把计算后全0的行去掉才能得出正确结论。

那方程多了会发生啥?

方程过多的情况比较少,我这也就不举例子了,但是你可以想象一下,如果多出来的行全为0,那么无伤大雅,多出来的部分被去掉就行。如果不是0我们会得到一个类似这样的矩阵:

  1. 1 a b
  2. 0 1 c
  3. 0 0 1

那么这个矩阵意味着啥呢?我们把方程还原回来就是1=0了!这显然是一个不成立的结果。这也正是因为定义了过多的方程,并且这些方程中存在冲突。例如我一边希望x=1一边希望x=2,然后代入的时候就会出现矛盾了。至于更多的方程的时候,因为矛盾已经产生,所以无法再继续进行下去了。不过做矩阵计算的时候,只要没出现矛盾(即秩大于n)就应该继续计算直到把多出来的行全部化为0或者出现矛盾。

最后看看为啥反应方程能得出唯一解

我们最后处理出来的矩阵长这样

  1. 1 -2 0 0 0
  2. 0 1 -1 0 0
  3. 0 0 1 -1 0

你仔细想想我们实际的反应方程,我们系数全部乘x不也是成立的吗?但是我们不会那样写,这只是数学上成立。实际上我们要的是一个最简比,这样解当然得不到最后的结论。同时你应该发现我们解的这个方程常数项始终是0,实际上我们可以去掉,我们只要得出xn-1=?xn就可以了。所以我们实际解的方程的矩阵是这样

  1. 1 -2 0 0
  2. 0 1 -1 0
  3. 0 0 1 -1

然后我们令x4=1;然后可以得出

  1. x3=-1*(x4*(-1))/1=1
  2. x2=-1*(x4*0+x3*(-1))/1=1
  3. x1=-1*(x4*0+x3*0+x2*(-2))/1=2

当然,如果这中间出现了分数,则应化至最简单然后给各项都乘上。另外,由于绝大多数编程语言都没有分数计算的功能,而使用小数,不仅丢失精度,也不知道分母是多少,这会给我们的计算带来许多不确定性,因此需要自己实现分数计算,包括前面的数据处理就应该使用分数(很巧我用的例子正好都是整数),加减乘除都是初中难度就不多说了,唯一复杂的是怎么样将分数化简到最简。一个简单的思路是从二者之间值较小的那个取起,然后依次减少直到为2,如果中间的数字能被分子分母同时整除就用这个数进行依次约分。另外记得负号的处理,不然会很痛苦的。

最后谈谈特殊情况

这里还有一种特殊情况,如果我们矩阵算到了这个程度(c≠0)

  1. 1 a b c
  2. 0 0 d e
  3. ? ? ? ?

那么我们显然没法通过乘法让第n行第n列(这里是n=2)的0变成1了,这时候需要将下一行拿过来计算了,如果所有的行都这样那么这个方程就会因为xn不能确定而卡住,那么这样的方程也是求不出唯一解的

我又双叒叕失眠了

2020-06-06 16:33:59

不知不觉已经工作一年了,当初跟我同一天入职的还有另一个人,前段时间他离职了。我虽然以前也有想过这种事情,但是没想到这一天这么快就来了。毕竟出门在外,有很多东西真的太难了,我也曾想过我是该在家还是出来。但是如果我现在就回家乡工作的话出来的概率几乎为零。

梦想

“你的梦想呢?说好的珠海呢?”这是我堂姐在我高考后填报完志愿时跟我说的话。是的,我错过了一个来珠海的机会。可是这也是必然的,毕竟珠海没啥高校,并且,至少就我们省而言,考广东省内的学校“性价比”太低。我有个小学同学,就表示考了个一本的分数,填广东的学校,然后基本上就是省内二本的水平。不过在这之后,还有一次机会——校招。现在来说,已经是前年10月左右的事情了,正好是珠海的多家企业来我们学校进行校招。那我自然不想放弃这次机会。然后一番折腾之后,我应聘了两家。中间还有一番折腾,以及一些我自己失误导致一些不太舒服的地方,这里就不多说了。总之,就这样我跟珠海这边的企业签订了三方协议,毕业之后,我就来珠海了。

我曾在省会这种二线城市(当然现在是一线了)转晕了头,出门就打的去个地方从未少于半小时能到;以及儿时在去过一趟深圳,每天的活动就是起床坐老久的车去爸妈各种亲戚和以前的同事(因为那个年代的改制,所以)家串串,然后又是坐挺久的车回去,然后就可以准备洗洗睡了。即便是工作,也会是在长时间的通勤中奔波。相比之下,我家那种小城市,大多数地方都能半小时内到达,偶尔有远一点的,我都觉得坐了老久的车了,但至少今天来看,公交一小时不堵车也基本能覆盖全城了。此外大城市的消费也是让人望尘莫及的。因此,我对大城市的印象便一直不太好。

当然,我也不是说大城市就没有啥好处。举个例子,我去深圳的时候,曾在一个小区见过大概是叫健身公园(吧)的地方(这个现在已经普及了),而我们这种小城市以前是没见过的,再诸如初中那会儿在长沙坐的地铁,不得不说这个是真的方便,而深圳则是在03年我去时就听到地下一直有动静,据说是在修地铁了;大城市的消费是高,但是工资也高,生活成本是差不多的,但是剩下来的那部分钱却要更多,在大城市要购买高档耐用品显然比在中小城市容易得多(家里有矿除外),虽然生活必需品的价格会高些,但是这些东西的价格,基本差距不大,特别是在这个互联网发达的时代,大不了网购,全国基本就一个价了。但是,相比之下为了08年奥运会,那种健身公园也没过多久也找到了类似的地方,并且还有更多的在建设。是的,中小城市失去了最早体验这些东西,但是这种东西仍然会存在于中小城市。再比如宽带,大城市无疑能办理到速度更快的宽带,可是呢,如今农村也会有价格合适且速度良好的宽带了,小城市想找个用着舒服的宽带自然也不是什么难事(只是余下来的钱不多了,并不希望在这地方花太多的钱罢了)。

当然初中时,因为很多原因,对金山软件有一些感情,加上前面说的那些,我想找一个合适的城市,它不是那种我前面所说的大城市,并且发展状况也不错,至少政府眼光要比我们那种小小城市跟长远一点。珠海正是这样的一座城市。因此,我曾说过希望将来有一天能到珠海生活。这便是我曾经的梦想。

现实

自始至终我都是凭借当初的几张图片,以及自己的理解来揣测在珠海生活的模样。至于珠海到底是什么样的,只有来了才知道。

我家作为京广线沿线城市,自然是国内最早通上高铁的城市,并且坐高铁直达广州,然后从广州坐城轨到珠海,这中间除了需要一次转车以外似乎还挺顺畅的。此外家乡那小小城市也终于是在9012年修好了机场能飞一些城市,但是无奈的是直到今天,直达珠海的航班也还在谈着,是否会有还不知道。但是还有一个办法就是从省会转,同样的高铁到省会,然后省会高铁站坐磁悬浮到机场,然后到珠海。当然普速的火车也能让我到省会,并且普速的车站离我家还挺近的,只是在省会要多坐40分钟地铁。

这一路似乎不会有什么麻烦事了。当然也确实不能算麻烦事。但是也没想象的美好、由于学校毕业证一拖再拖,尽管是第一批,但也直到六月下旬才拿到毕业证(不得不说,其实在学校还是挺好的),机票价格我是一路看着往上涨了上去,毕竟暑假到了,特价机票就是越来也少的。除了那一次,剩下国庆和春节,机票价格只有更高的。因此这个也是可以放弃的了。剩下的,也就只有高铁了。高铁从家到广州几个小时,其实是挺快的了,但是吧,这没结束啊,还得继续花一小时到珠海,这样一算半天时间就没了,这倒是也罢了。我从珠海站之后首先看到的是出租车的点,公交在后面,想想打个的吧,毕竟“打个的快得多”。可是我掏出手机一查,打的预计花费3位数,还是公交吧。珠海公交无论多远,一趟车都是一元,这里点个赞。不过该说的还是得说,这公交一座就是一个多小时,这还没完,因为这是快车,不是所有站都停的,我下车的位置离公司还有那么一段距离,我看地图上就剩下一小节了,按平时的话,走过去就行了,可是这看上去的一小段可远没有看着的那么简单,那一小段只是在前面那么长的一段的衬托下显得比较短了,实际上2千多米呢。走路得半小时。于是还是等车吧。这中间有些摩的司机问我去哪,然后他们也不会走,还说没有这个厂。如果不是通过正规校招过来的,我甚至都有点怀疑了。不过再怎么菜,地图和公交车站牌我还是会看的,最终我还是坐上了下一趟公交到了公司附近了。

下车后还有点插曲,我以为这里会跟在学校时我们去参观的工业园区一样。看到我们公司的牌子了,便想从边上的门进去然后被保安拦了下来。然后才知道这里并不是那种园区。于是又继续走,终于到了。这一趟下来白天的时间就已经过的差不多了,然后跟人事那边磕到了几句,完善了下档案等信息,便先放我去休息了。之后是签劳动合同,然后入职培训什么七七八八的。中间被空调吹到肚子疼。

接下来,我碰到第一个难关就是孤独一人。虽然有一定心理准备,但是工作不比上学。在学校,总归还是有认识的,实在不行还能回家缓缓,可是现在回家一趟来回路费1K左右,路上时间两天了,因此无论是时间还是花费都注定我不能想家就回。再者,在学校,大家都来自天南地北,班上的人都是初来乍到,年龄也差不多,慢慢互相认识。我这种内向的慢慢来就好。而上班不一样,我得融入一个已经成立的团队,并且年龄差距也大了不少,想法和目标也不一样,这样一来我便很难和他们有更多的交集。我便更是独自一人了。每当看到有些在同一个城市(一般是省会、广州、深圳)的偶尔还能去串串的,便越发感到孤独。

工作这块到还行,总体上还是挺轻松的。但是谈不上顺心。作为一个自动化专业毕业的,我却在做软件开发这块的活,并且被分配在了web前端这块。这倒是没啥难的,在高二的时候我就自学过很多相关的东西了,比如这个网站,核心部分也是高中摸鱼时候做的。虽然几乎没接触过什么框架或者第三方库,但是这些东西自己动手实现一遍感觉更加像是学习而不是搬砖,至少我自己觉得这块我基础还是不错的。事实也确实如此,虽然一开始接触vue+webpack打包的时候脑袋上满是问号,但是逐渐熟悉之后开始着手逐步查询相关功能实现原理之后就能发现这还真没什么东西。主要根源还是在于大学4年没太接触这些东西了,比如vue双向绑定最核心的就是get和set,这个其实很久以前就有了,只是兼容性差,并且我菜,所以我不知道还能这样用,但是4年过去,这个已经是个大浏览器都支持的标准了,vue的这种设计也大大减轻了开发的负担而被广泛使用了,这几年时间发生了太多事,但是当然,最基本的东西永远不会变。不过呢,公司项目不算大,所以也做起来,也没太多需要认真去想的,至少到我这里来之后就是这样了。除了最初做了几个组件之后,剩下的工作基本上就是套组件就行了。除此之外就是复制粘贴+改bug。我曾经看某微软office开发人员的微博说“每天在一堆看不懂的代码中改bug,有没有修复好也不知道”,感觉很是滑稽,可是终究有一天我也在面对同样的问题。

总之,我对我现在的工作的看法是:它既不是体力劳动又不是脑力劳动。举个例子,前段时间为了加个功能,我给一个控件传入了一个参数,然后发现并没有生效,于是我去看为啥没生效,结果发现里面表示同一个东西的变量有4个(当然因为vue不可改变输出参数的原则,所以我们一般的做法也确实会多定一个内部的变量),一会儿用的这个,一会儿又用了另外一个,这就不出问题就怪了,于是我对这些变量做了合并,你说这事吧让不会的人做吧好像也确实改不出来,让会的人做吧,也是不需要用脑子想的。但是这种事情却要占据不少的时间。总的来说,倒是确实工作不累,工资还算行吧,至少比在家乡工资会高点,并且不太需要加班,加班了也能调休,在这方面还算不错的。

但是生活上就不一样了。正如我前面所说,干的活既不是体力劳动又不是脑力劳动,每天饭还是一样的吃,特别是我这种比较坚持吃早餐的,前几天上秤称一下又长胖了,这就不是个好事情了。另外公司在金湾区,某种程度上,甚至感觉是珠海与金湾区,都不止是斗门区、香洲区与金湾区了。附近啥去处也没有,远了的时间成本我又接受不了,虽然我是有点宅,但还是怪难受的。此外珠海的空气虽好,可是上班关在办公室空调开着,窗户关着,晚上办公室的窗户更不会开,而且窗户的设计,开着也就那么回事。回到宿舍后,很可能空调继续开着,然后根本没太多机会接触外面的空气。另外宿舍环境虽然不差,但是,首先肯定比不过家里,其次,大学期间我们15级宿舍是14年修好的,再差也还行吧,自然就会有对比和不适应的地方。

至于回家,凭借在学校时的抢票经验,我还是为自己抢到了国庆和春节回家车票,但是,这可比从学校回家的票难买多了。以后是否会有这么好的机会也难说。

梦碎

尽管在来之前,来的时候我都想过是否应该出来。但是我想,至少出来看看不给自己留下遗憾,要走也不是不能走。来了之后,正巧有跟我同一天入职同部门的应届毕业生,然后我们分配在一个宿舍。他曾经跟我说过,他会走的,但是计划是在一年半以后。可是现在不到一年时间,他便离职了。尽管很高兴我能独自待着了,但是晚上睡觉时,闭上眼睛,儿时的那一幕幕又浮现在了眼前。这使我整夜无法入睡。我睡眠一直就不太好,但是渐渐的,我已经能正常入睡了。可是大学里面把我的入睡时间一再的向后拖。而这几天,我甚至似乎忘了如何入睡。

我思考着我为什么来这里,我来这里收货了啥?可是我似乎找不到答案。显然,我收货不大。论学,学到的东西甚少。如我前面所说,这既不是体力劳动也不是脑力劳动。论玩,是的,我是去看了一次海,但是更准确来说是珠江,这并没有让我感受到大海的广阔——除了几个椰子树,这和我们小城市的某湖泊差不多,当然都是一望无际,可是无论他们哪个更广阔,我能看到的都是他们消失在海天相交的尽头。我还看到了港珠澳大桥。但我也只去了一次,毕竟路上单程就要2小时了,这可没有电影中的那么惬意。

公司目前的待遇到还行,但是正如我前面所说,因为我自己的操作,谈工资的时候我自己开的低了,本指望人事那边会做做好人的,可是,还真就我说多少就是多少了。本还想着,工资能涨的。可是步入社会之后才知道这工资是按原工资按比例涨的,换句话说,工资低的涨的也满。何况转正的时候还是按我协议转正加的最低的那档算的。之后年终奖安转正一个月算的,所以也只发了一个月的,看上去如果能拿到一年的也还行了。但是我的效绩却被打的c,这可不是什么令人愉悦的事情。当然了,今年开工后工资又涨了点,总体上看着还行。但是我是否还会继续做下去呢?我不得而知。若是下半年还能涨涨工资倒是还行。不然这通货膨胀过下去,钱迟早不够用的,何况如果要在这边长期发展,房子就还是得考虑,这可是一笔不小的开支。至于年终奖倒是还行,只是希望别再是c了,哪怕是同样的钱,至少心里舒服点。虽然我得承认我没做太多事,但是也没太多我可以做的。

至于长期发展,我曾和别人聊到过广州的教育问题。我们似乎普遍认为在大城市便能获得更好的教育资源。可是事实上却并没有那么简单,大城市尽管教育资源更多更好,可是大家也都是这么想的。于是大城市中教育资源分配下来压力还是挺大的。他们初中的课程直接被砍掉了几门,考啥不考啥又教育局说了算,而我们初中阶段是不区分这些的,10门全考。于是造就了我们满分1060分的不是很懂为啥别的地方考试只有那么几百分就是满分了,反过来他们也很奇怪为什么会有一千多分的。减少几门课减少负担到不见得一定就是坏事。但是没有选择的削减这就容易产生问题了。例如广州现在这届中考是没有历史的,甚至在在初中入学这门课程就被丢到一边了,此外生物地理因为是在初二会考考完了,所以也不会带到中考,也不会重视(我们那边的做法是保留会考生物地理成绩加入中考成绩中)。这样,等高考时,他们已经没有选择了。按自己兴趣选择课程已经是无从谈起,甚至还不得不去面对自己讨厌的课程(10门全考的模式下虽然讨厌的课程也要考,但是相对来说可以靠其他课程平衡一下,并且负担大不是一个人负担大,大家都是一样的)

回忆

正如某歌曲所说,回忆越美好,却越是伤人。在现在各类所谓主课老师占各类所谓副科课时的时候,想想我小学时,尽管这类课程有被占用过,但是绝大多数时候都会正常上课,一如科学课,我认为这种课程在小学开设还是很有必要的。我所在的学校,也是非常认真的对待这门课程的。我印象中比较深的是指南针的原理,还有电池点亮小灯泡,给我们每人发个油菜花观察结构,甚至还有走出教室出去观察昆虫动物,这恐怕在很多城市里这种课程是个奢望。除了科学课,我们的音乐课也是实打实的上的,从识谱开始,当然音乐教材上是简谱,所以我们学的也是简谱,五线谱只是顺便一提,但是也算是打了基础,从音符是时值到音高,到反复标记再到渐强渐弱,甚至是换气符号。老师一般都会带个电子琴过来上课,我们也偶尔上去摸摸,虽然指法什么的都不对,但是弹个调出来还是没啥问题。竖笛这种相对便宜的更是人手一个。然后还会放一段有各种乐器的录音让我们去听去分析有哪些乐器。甚至有一次跟我们说放一段音乐让我们去把谱子写出来,当然这个只是老师自己做了个示范,然后并没有真正让我们做。而学校对这种音乐课的态度呢?跟其他学校形成鲜明反差的是我们学校在音乐老师先做一个合唱的时候,可以向班主任求助,然后几个班安排调课,然后去电教室完成的(那时候并不是每个教室都有投影和音响的,我们那种比较老的学校,只有两个电教室有这个条件,一般的教室只有个普通24寸电视,还是接的校电视台,不过说起来,曾经学校还用这个在班会课时间放《哈利波特》给我们看),并且班主任全程监督,想摸鱼划水?不可能的。相对而言美术课就比较水了,但是我们仍然做过剪纸,甚至在老师的带领下,在上课时间去公园做写生。至于体育课,我们更是没少活动过。

当然,我们市也不是每个学校都能做得这么好,我那时候那个学校算是市里软实力相当好的了,只是硬件条件差点,毕竟是老学校了,不过现在已经搬到新校区了。到了初中这个问题就开始能看出来了,音乐课上老师画的五线谱能看出问题了,甚至有人认为这种课就是用来玩的。毕竟这种东西小时候这样过来的,也没啥奇怪了。但也是因为如此,老师做了几节课之后便放弃了,开始给我们放电影看了。但是少了音乐美术,我们仍然还是有10门课的。语文、数学、英语、生物、地理、物理、化学、政治、历史和体育。是的在很多地方现在还在考虑把体育纳入中考之前,我们那早就是有体育的,并且分值100分,和其他课程一样。虽然看起来学的有点多压力会很大,但是其实不然。至少,初中是我最快乐的时光。至于中考难度,我们市设置就不是太高,虽然的确会刷掉不少人,但是刷掉的那些,你去看看也知道,确实没有啥上高中的必要了。然后是教育资源均衡的问题。我们那届倒是没啥亮点,除了严查关系户进好学校以外没有太多动作,但是之后几年,这一块改进挺大的,现在即使在一个很差的初中只要你能考到校前几也是能上个好的高中的,因为其录取方式除了全市排名录取一部分以外,还会根据学校参考的总人数给予一定的名额,从而在一定程度上消减不同学校教学质量的差距,之后录取情况会在各个学校的网站上进行公示,以接受监督。若论可惜之处就是我中考比较差的3门就是历史,英语,语文。后两科影响了我太多的东西。但是比起在一堆学校不然考的外地,我这已经很幸福了。

到了高中自然是文理分科,但是,有个学考我们也会认真准备,于是造成了我学考除了语文数学英语以外全市90分以上的成绩,可惜了,哎。当然,体育已经不再考试了,学考只是象征性的考了下体育。但是体育课还是有的,甚至在高三期间也是每周都有体育课的。只是那个体育课跟以前的没法比,我们甚至搞了两幅扑克躲到没人的实验室打起了升级。身体素质自然也是有所下降的了。此外,我们市直高中全部不接收复读生。这个我也不知道怎么说,但是我觉得这不是什么坏事。总之,高中的点点滴滴也挺美好的,但想起之时我们已经回不到过去。

儿时憧憬着未来,对分别也没啥好怕的,分别只为更好的相遇。可是如今,我们还会再相遇吗,再学校还有无限的憧憬,但是工作之后,就只剩下工作和无尽的回忆了。真心希望有一天家乡也能在经济上变强。我也能好好回家乡工作了。期待着这么一天吧。

除了已经远去的校园生活外,搬家,爷爷的离去,小学同学的模样和初中时我们一起出去玩的场景等等这些始终在我脑海中浮现。

2020年6月6日——考完开始5年之后。也是一周失眠两个晚上之后。也许有一定的负面情绪,但是写写要比憋着好,希望之后的夜里闭上眼睛不要再被回忆所伤。

Vue的模板继承

2020-05-19 10:52:40

首先说说需求:以前我们有一个界面用来编辑一个带明细的数据。其效果大致如下:

页面布局

但是现在由于功能拓展,明细需要新增一个模式,跟原来的处理方式差距很大,所以明细的编辑部分需要全部重新开发。但是表头部分的处理时完全一致的,并且,进入页面需要请求接口锁定数据(并确定允许修改),退出时需要调接口解除锁定,这块的逻辑也是一样的。因此最理想的办法当然是把表头和基本逻辑分离出来,然后根据需要加载不同的明细组件。但是呢,由于明细这边有调用不少表头的数据,分割成两个组件会比较麻烦,于是想将主表和锁定的逻辑写到base.vue中,然后两种明细各自使用extends函数继承这部分内容。

但是想法很美好,现实却很糟糕我们想象只需要把明细做一个插槽塞给父组件就能把两个模板都显示出来,就像这样:

base.vue:

  1. <template>
  2. <aside>我是表头</aside>
  3. <main><slot name="body"></slot><main>
  4. </template>

具体控件:

  1. <template slot="body">
  2. <div>我是明细</div>
  3. </template>

显示效果:

  1. <template>
  2. <aside>我是表头</aside>
  3. <main><div>我是明细</div><main>
  4. </template>

可是事与愿望违,子组件的模板还是直接把父组件的模板覆盖了。尽管锁定逻辑正常执行,但是主表并不会显示出来。查阅大量资料,发现使用extends继承的都没法好好解决这个问题,而另一种,根本就不是继承,而是把父组件引入进来使用,这样二者之间的变量是不能直接相互访问的(主要是这里需要写入数据)。

不过呢,网上还是有些有价值的数据,比如有个地方就提到在render函数中使用this.extends.render.apply(this, arguments)来渲染父模板。但是呢,我测试的时候发现父模板还是没有渲染出来。同时我有个疑问,如果我一个.vue文件中既有template模板又有render函数会发生什么?还有如果我只有template模板,没有定义render函数为啥不报错?带着这些疑问,我把这些对象使用console.log打印出来看了下。

始终存在的render函数

然后我就发现问题所在了,无论我怎么写,结果中都是只有render函数没有template模板。对于这个现象的推测,我认为是在打包时如果有template,则根据这个template生成render函数,无论原先是否有render函数,都将被这个生成的render函数替换掉。去掉我子组件的template,OK,父组件果然渲染出来了,那么接下来就是想办法把子组件的模板也显示出来。可是直接写template会把render覆盖掉,难道我们只能在render中自己一个一个创建?或者用jsx?

可是即使是jsx,也不能直接把原先的template拿来使用,因此,这里还需要再想想办法。于是我想,既然我们能渲染父组件的模板,我们是不是也可以渲染子组件的模板,然后把它塞到父组件的槽里面?我们先打个断点跟踪进去看看槽是怎么被显示出来的:

首先这是render中渲染槽函数的位置:

渲染插槽的位置

断点步入进去看看:

插槽的渲染

这下简单了,我这里简单分析下这段:

  1. function renderSlot (
  2. name,
  3. fallback,
  4. props,
  5. bindObject
  6. ) {
  7. var scopedSlotFn = this.$scopedSlots[name];//尝试根据槽的名称从$scopedSlots中获取槽的渲染函数
  8. var nodes;
  9. if (scopedSlotFn) { // scoped slot 如果有渲染函数
  10. props = props || {};//检查参数
  11. if (bindObject) {//检查绑点对象
  12. if (!isObject(bindObject)) {
  13. warn(
  14. 'slot v-bind without argument expects an Object',
  15. this
  16. );
  17. }
  18. props = extend(extend({}, bindObject), props);
  19. }
  20. nodes = scopedSlotFn(props) || fallback;//调用渲染函数
  21. } else {//如果没找到则直接从$slots中取
  22. nodes = this.$slots[name] || fallback;
  23. }
  24. var target = props && props.slot;
  25. //返回结果
  26. if (target) {
  27. return this.$createElement('template', { slot: target }, nodes)
  28. } else {
  29. return nodes
  30. }
  31. }

好了,到这里我们应该可以知道这个过程了,如果我们是渲染函数,丢进this.$scopedSlots中,如果是已经执行过的则丢进this.$slots中。

虽然我们拿到的是两个渲染函数,但是为了防止出现问题,我决定还是自己调用render.apply然后扔到this.$slots中比较靠谱。这里中间层是不可避免的。考虑到其他地方会需要使用,这里定义一个函数来生成这个中间层:

  1. export default function(child,slot){
  2. if(!"extends" in child){
  3. return child;
  4. }
  5. return {
  6. extends:child,
  7. render(){
  8. //由于vue不能支持模板继承,这里使用一个中间组件,分别渲染父组件和子组件模板,并将子组件以槽的方式注入父组件中
  9. this.$slots[slot]=child.render.apply(this, arguments);
  10. var superRendered = child.extends.render.apply(this, arguments);
  11. return superRendered;
  12. }
  13. };
  14. }

用的时候直接使用如下代码引入

  1. import baseList from "./components/list";
  2. import templateExtend from "../common/template-extend.js";
  3. var List=templateExtend(baseList,"detail");

然后使用List这个对象就能同时渲染出父子组件的模板了。好了至此问题不太完美的解决了,不过不管怎么说,还是解决了。不知道何年何月,Vue自身会不会支持这种样子的模板继承呢?

Say goodbye to IE

2020-04-02 15:23:42

想我第一次接触做网页的时候,还是我初中时候看到信息课教材上用dw做一些简单的静态网页。随后因为许许多多的原因,逐步加入的PHP和js两个大块的内容。网站用的是类似以前MVC的分层结构(但是并不完全相同),核心逻辑都是在后台完成的。为了保证SEO,原则上,页面能后台生成的部分都用后台生成。此外,尽管我们会采用一些新的技术(例如css3画圆角,当然现在来看也已经很老套了),但是因为我早期使用的就是IE,尽管之后用了火狐(FireFox)再到谷歌浏览器(Chrome),现在已经很少用IE了,因此我还是一直是保持了IE兼容性的,尽管可能是需要高版本IE才能正常体验全部功能。就在前段时间,我甚至还把MarkDown语法解析在后端做了一份,目的就是为了搜索引擎能够识别出这些内容来。

相比起我刚开始做这个网站来说,已经这么多年过去了,时代可能变了,我也不能一直采用这种结构下去了。这事情的起因大致就是我这段时间需要做一些新功能,本身就是要大量使用js计算的工程,加上现在工作也是用的vue,所以萌生了自己实现部分vue功能的想法,尽管现在核心的功能可以实现,但是还有很多其他问题。我这里从以前的用户登录问题说起吧。

先来谈谈用户的问题

之后因为要保持模块独立并解决跨域cookie的问题,我把除用户中心以外的获取的所有搬到了前端,通过跨域ajax获取到用户token及用户名等信息。这给我们造成了不小的困难,因为我们无法在用户打开页面之前获取到用户的token。当然,这也不是完全没有办法的,我这里说两种方案:

一种是用户中心登录时,通过某些方式让浏览器访问各个子站点,然后子站点通过访问的地址写token。但是,实际上如果我有100个子站点(尽管实际上我没有),但是用户只需要访问其中的一到两个,这个100个站点的访问需要占用大量资源不说,利用率还低。同时这100个站点可能会有访问失败的,然后就会是各站点之间账号不同步。这种做法是我初期同步主站和DZ论坛登录的做法(但是效果并不好,甚至经常失败)。

另一种比较可行的方式用户中心要生成两个token,一个AccountToken(即绑定账号的token)和ClientToken(即客户端token),同时存储这两个token的关系。其工作原理是但用户访问用户中心时,如果ClientToken不存在就给他生成一个ClientToken,用一个有效期足够长的时间的cookie来存储,同时数据库的token关系表中记录这个token(当然也可以不急着记录),当用户登录时,向之前一样生成一个token,这个就是AccountToken,但是,这个token不下发到cookie中,而是写入数据库和当前ClientToken绑定。当访问其他站点时,子站点也是获取ClientToken(不存在则先向用户中心请求,然后通过回调页面写入cookie再重定向回原来的页面,cookie的有效期设置为session,这样,如果这个ClientToken不同步了,只需要重启浏览器就能自动重新从用户中心获取),这种操作会有一个特征就是第一次打开子站点的时候是会有一次跳转(或ajax请求)然后回之前页面(或刷新)的,可以参考渣浪微博。这种办法建立在唯一且不变的ClientToken的基础上,用户信息始终存储在服务器,根据客户端的token从服务器中查出用户信息,因此,各子站点只要能访问这个记录关系的数据库就可以获取到用户登录状态。尽管这个ClientToken并不能做到真正的唯一且不变,但是,只要用户不人为删除或修改cookie的值,并且用户中心的cookie不过期就不会出现这种问题。即使发生这种情况,只需重启浏览器就能重新同步了,除非有人故意搞事(但也就给自己添麻烦)就不会出现这种问题。

我这里暂时还没多少变动(因为改的话影响会有点大,不过可能会要改的了)。

页面无刷新切换url技术

我一直使用的是php通过后台查询数据,在后台组装成一个生成好的网页返回。可是并不是所有情况下这个做法都能获得最好的结果。首先,如果你们有注意到我博客电脑版网页的页面切换的话,你会发现他是一个ajax请求,而不是整页刷新,这么做的目的是为了点击站内链接之后bgm控件不会退出而刷新。这个过程js监控了a标签的点击并取消事件阻止跳转,然后通过ajax向后台请求网页内容,并附带isajax之类的字段。此时后台PHP程序我的框架会在调用show_head函数处保存标题但不输出头部html,当网页主体生成完毕后会调用show_foot函数,此时该函数不再输出网站脚步,而是读取ob缓存的网页主题,然后和保存的标题一并打包成json格式给客户端。客户端收到,这个json数据之后,取出标题并更新标题,然后内容通过innerHTML字段暴力写入网页文档中,然后找到里面所有的scrip标签并通过evel重新执行脚本,最后重新绑定所有a标签的事件。这样就可以在几乎不修改原有代码的情况下实现无刷新跳转功能。但是这时候还有个问题没有解决,就是我们的url是没有改变的,此时,用户刷新页面会回到他打开时的那个页面,同时,他也不方便将当前看到的网页分享给其他人。

由于直接修改loction会导致网页跳转,因此,传统做法是用“锚点”,也就是在url结尾加上"#xxx"这种格式的内容,由于这些锚点原本是在页面之内定位用的,所以改变锚点并不会引起网页跳转刷新,但是这个锚点的内容可以通过js获取,同时,请求的时候浏览器也会作为url的一部分发送给服务器,所以要在后端判断是访问哪个页面也不难。不过这样做会有两个问题,一个是SEO,因为在搜索引擎看来这是一个页面(也就是说这时候其实搜索引起就已经技术跟不上了),所以它无法理解锚点变化之后会发生什么。其次,这回影响到原有锚点的功能,毕竟他只能存放一个值,存放了实际url就不能存放页面内的锚点地址了。

正是由于这样的原因,有了一个新的方案——history API,我以前发布过一个关于这个的文章,我的博客也正是用的这种方式。简单来说就是浏览器提供一个API,通过这个API,我们可以向浏览器中写入历史记录从而实现跳转的效果,通过这个API,我们就能完美的解决我们的问题,同时还能修改好网站标题了。当然,这个API需要当时非常“先进”的IE10才能执行,但是,终究,他还是一个IE兼容的东西。

但是,这里我仍然有一个坑,就是内容并不完全独立,如果有301或者302重定向,这时候isajax字段会在第二次请求时丢失,于是又会返回一个完整的网页。此外通过innerHTML写入也存在诸多问题。因此这种更新页面内容的方式并不完美(但是更新url的还是完美的),可能会要修改成更合理的要啥更新啥。

最后所js的双向绑定

其实吧,我一开始想,后台生成内容,如果需要js频繁修改的话,我可以给他生成一个带idspan之类的元素,js需要修改的时候,我js通过id获取dom节点然后innerHTML写入就行了,这样,后台能给他写入一个初始值给搜索引擎看,同时也能通过js修改。一开始我感觉vue也就那么一回事,我那样操作也不是太麻烦。但还是,随着时间变化,特别是现在写的倾向前端的东西多了,感觉这个还是挺香的。首先,直接绑定就是多一事不如少一事。其次有个大问题就是如果一个控件的内容如果要绑定,多个相同控件的id就会冲突。我现在做的小项目的做法是改成class识别,每个控件生成的时候直接用他外面生成的div框去找。但是首先,就是多了这个div框,其次,这时候后端也管不到这个控件了。因此这样一来双向绑定也不存在问题了。

既然那个项目本来就是前端js计算为主,那我可以整双向绑定了吧。但是似乎为此引进个vue好像也没必要,并且也和我现在的模式不完全兼容。自己实现个双向绑定其实也不难,其实也就是defineProperty,这个我几年前就知道了,然后去读DOM中的各个节点来绑定。不过以前一个是没想到这个defineProperty能这样用,而且那时候IE兼用不好。不过现在ie也多对defineProperty有良好的兼容了。所以我就开干了。

绑定的功能也差不多就绪了,可是,回头一看,还有新问题。我后端取模板是直接到模板目录取,直接include就行,可是前端呢?直接后端一次全部输出到HTML中?我都不知道是否能用上,这自然就不是一个好主意了,毕竟,我能不能用上又是一回事,这些数据又不会缓存的。专门放个前端模板?首先感觉有点别扭,其次我可能要等多个子模块,顺序请求肯定不是个好主意,但是,并发请求如何保证所有请求都能回来呢?Promise是有一些封装的,虽然感觉如果只是回调的话,它算不上多香,但是它有个all方法,就很方便了。但是这个办法不支持IE,并且ajax请求不能跨域,所以想在其他域放基础模块时有点问题的,要加上跨域的响应头才行。还有就是模块自身的脚本怎么引入执行evel?恐怕仍然不是一个好主意。还有一种方式就是用import之类的,这样ie还是不支持,然后模板又成问题了。

Say goodbye to IE

当我忽然觉得IE这也不行那也不行,就是连currentScript也不能支持的时候,还有之前写的箭头函数,因为ie不支持,我又改回去了。我忽然发现,时间是真的过的快,这些年已经发生了翻天覆地的变化,转眼就是好几年过去了。以前我啦IE兼容,兼容的是win7的IE,那时候是要淘汰xp。而现在,微软极力推行win10,win7的IE自然也不在支持的行列,甚至,IE也已经凉了,微软在推Edge了,IE已经退出历史舞台不再更新了,这些都不支持也正常的。当然是用webpack打包带上一些插件去处理,可以解决这些问题,但是,这中间还有许许多多的问题。仔细想来,我这小破站子也许是该做一次升级了,尽管具体采用何种模式我暂时还没确定,抽空想想。至少以后新做的东西,会采用一些新的模式。IE的包袱,大概是改丢了,但是向博客这边,SEO怎么整我还不知道。并且,如果改的话,大概是涉及到网站的基础了。

分类列表更多
杂项
。。。