题外话

  最近简直要忙死,所以停更了很久,你们会不会以为我人间蒸发了?

  正文之前,请允许我先跑个题,就是关于忙的问题。

  做了Freelance,每天过的比上班还累,这完全不是我想要的生活啊?所以痛定思痛,需要检讨一下自己:

  1. 首先仍然是目标,工作需要确定目标,生活也是一样的。如果你的目标是做一番事业,那不得不说,忙才是正常的状态。如果觉得累了,希望生活和工作能有一个平衡,那就要下决心改变自己的状态。
  2. 关于工作,如果目标是挣大钱,而且从时间上更紧迫。那接单的时候,就考虑优先完成利润高的。排序上利润低的需求,还是要勇敢的说“不”。
  3. 如果你的目标是维护朋友、客户的关系,希望将来能有更好的回报。那现在很多不挣钱的项目,做了也就做了,也没有什么好抱怨的。更需要的,是调整自己的心态,接受现状。

前端

​  工作终于告一段落,今天念叨念叨最近一个项目的小体会。

​  前端的工具链无比繁荣丰富,也带来了大量的选型、学习的问题,这个在网上吐槽已久,我就不画蛇添足了。

​  我本身过手的项目比较多,所以挺早就做了一些比较,单纯从个人爱好入手(不代表性能、功能、框架结构的优势)做了如下的划分:

业务类型 选型
功能性项目,更多偏向HTML层的处理 JQuery.js
小型商业逻辑项目 vue.js
大型或者将来可能快速成长的商务逻辑 AngularJS

  最近的项目使用了AngularJS7,中间有了不少新的体会,分享出来希望能对大家有用。

AngularJS版本

  通常AngularJS项目的构建、编译、管理等都是由@angular/cli模块完成的。这个模块简便的安装方法是依赖npm, 而@angular/cli本身也依赖网络,因此当AngularJS有了新版本,所有使用客户端ng建立项目,也就自动使用了AngularJS的新版本。更不要说npm的升级中,也会直接升级了@angular/cli本身。

  好在从AngularJS2之后,框架和语法糖方面的变化并没有多大,如果类似AngularJS1到2那种剧烈的变化,相信很多人会直接哭死吧:)

  即便如此,在一个复杂的项目中,不可避免仍然还会有不少版本升级带来的兼容性问题。这时候如果是以前建立的项目,使用保留的package.json直接安装依赖包,自动在老版本下工作就好,不一定必须升级到AngularJS新版本,通常这样能省事不少。

  有的时候会碰到一些意外,就是某些依赖包,可能在npm的库中已经停止维护了,这时候依赖包的安装将无法成功。这在大公司中通常不是问题,大公司大多都使用自己的包镜像服务器,因此这种情况出现的少。但在中、小型公司,这是个很烦心的问题。我建议对于一些复杂的项目,尽可能的保留下来原有的node_modules 文件夹,毕竟跟硬盘容量比起来,这一点空间不算啥了,能让你将来项目的维护轻松许多。

  此外还可以考虑搜索多家的包服务器镜像,比如我经常同时安装cnpm、npm两套工具,前者使用阿里云的镜像,后者则是官方的服务器,发现某些包失维的时候,换一个源试试,很可能会有惊喜。

  有的时候还会碰到一些很特别的情况,必须使用老的AngularJS版本进行开发。这时候可以首先卸载当前的新版本@angular/cli, 然后使用npm 安装制定的老版本,比如1.4版本的客户端对应AngularJS4:

npm install @angular/cli@1.4

  这样之后使用ng新建的项目,将是AngularJS4的版本。当然这在工作中,也会碰到上面说的依赖包失维的问题,建议常用的功能包,平常自己就留意保留一些吧。

在AngularJS7中使用JQuery.js/Bootstrap等第三方功能库

  这几个包是在使用传统html页面的时候常用的,JQuery.js在很多的框架中已经不建议使用了,而是使用框架的组件或组件通讯类功能来完成相似的功能。Bootstrap则有很多社区提供的AngularJS化的组件库可以直接使用。

  对于前者,虽然的确感觉上在AngularJS中使用JQuery没有哲学上那么完美,但你不得不说在很多情况下的确用起来更方便,能大量的简化代码。对于后者,我个人的感觉把BootStrap库AngularJS组件化会带来额外的学习成本,感觉并不划算。所以介绍一下此类扩展库的使用方法:

  首先使用npm安装需要使用的第三方扩展包:

npm install jquery bootstrap@3 bootstrap-switch createjs-module --save

  随后打开angular.json文件,在projects一节,找到你的项目名称,随后在其options中,scripts参数后面的数组中添加所有需要引用的js库:

"scripts": [
"node_modules/jquery/dist/jquery.min.js",
"node_modules/bootstrap/dist/js/bootstrap.js",
"node_modules/bootstrap-switch/dist/js/bootstrap-switch.js"]

  需要注意,如果是AngularJS4, 文件名应当是.angular.json,scripts数组中添加的路径,应当是../node_modules/xxxx这样的路径,因为AngularJS7和4的默认路径是不同的。

  第三步是为bootstrap这样的UI库添加额外的css,这个比较容易。直接在默认的主css文件:src/styles.css增加额外的引用就可以了,比如:

@import "~bootstrap/dist/css/bootstrap.css";
@import "~bootstrap-switch/dist/css/bootstrap3/bootstrap-switch.css";

  做完第三步,css可以立即生效,js文件则仍然需要在AngularJS主程序中引用,比如:

...
import * as _ from 'lodash';
import * as $ from 'jquery';
import 'bootstrap-switch';
import * as createjs from 'createjs-module';
...
$('.url1').attr('href', '/home');

  注意这里面的引用并没有指定js的路径,路径实际是由angular.json文件中我们刚才修改的scripts一节决定的。此外就是通常我们使用import都是标准的typescript的形式,比如:

import { Component, OnInit } from '@angular/core';

  而我们对于JQuery.js库的引用,则使用了引用非结构化js的方法,重点是引用“*”也就是所有内容,然后用“as $”命名成平常我们喜欢的样子。对于bootstrap-switch库因为是直接在bootstrap原型上添加功能,所以干脆连“ * as ”也省略了。

使用自己积累的js库

  在日常的工作中,大多程序员肯定都保存了不少的函数库、功能库。这些库可以直接在typescript中引用,不需要改名字,引用的时候也不需要添加后缀。引用时候的路径,使用当前typescript文件的相对路径就可以。比如:

import { Lists } from '../jslib/lists';

  在使用的时候,跟原来在js中引用也完全一致。通常说,比上面介绍的引用JQuery.js之类的引用会更容易。其实这大多是因为npm所管理的node_modules路径规则太复杂所致,相比较npm模块管理带来的好处,你还是忍受的好:)

编译中报错的问题

  通常AngularJS的编译都能给出来比较清晰的错误提示,按图索骥,能够比较容易的解决问题。

  但也有很多时候,AngularJS并不能给出清晰的提示,比如UglifyJS处理中所出现的Unexpected token: punc (() - ES6 parsing errors。

  这时候可以在编译的时候增加参数:

ng build -prod --source-map

  此时编译过程中,虽然信息仍然不够完整,但能够比较清楚的界定到时哪一个文件的哪一行出现了问题。相信再找错误,就容易多了。当然既然开发模式编译时通过的,这时候的报错往往也是兼容性问题或者更严格的语法限制。

编译结果,在老版本ios设备无法使用的问题

  为了支持更多的设备,兼容早期的ios浏览器是很有必要的。但原本运行良好的项目,移植到AngularJS后就无法 在早期ios浏览器中使用了。现象是屏幕全白,没有任何内容和功能。

​  使用ios的联机功能,可以检查在浏览器中的报错信息。ios联机调试不是今天的重点,这里就跳过了。通常能得到错误信息为:

SyntaxError: Use of const in strict mode.

  其实主要还是老版本浏览器不能很好支持新的js语法的问题。在AngularJS中呈现出来,是因为AngularJS默认使用typescript编译。而通常的开发工具链是使用babel编译,而后者的编译结果,从向前兼容上,显然做的更好一些。

  解决办法有很多,网上有很多使用babel替代typescript的方法,但总体都比较麻烦,如果不是特别必要,就别折腾了。

  或者你还可以把js改写到ts文件,估计你更不愿意了,如果积累的库比较多,真的会累死人:)

  我的建议是,所有你自己添加的js包,集中存放在同一个目录下,比如我例子中的jslib。然后在另外的工作目录中,安装babel的工作环境:

npm install -g babel-cli
npm init
npm install --save-dev babel-preset-es2015

  在工作目录中,新建一个.babelrc的文件,内容为:

{
"presets": [
"es2015"
],
"plugins": []
}

  随后就可以将原有的js文件都编译一遍了(ts文件typescript处理的挺好,完全不需要使用babel),编译方法示例:

babel ../some_dir/jslib -d ../some_angular_dir/jslib

  这会编译jslib中的所有文件,文件夹结构也会保留,所以编译完成,直接用生成的jslib替换原来的文件夹。然后再使用AngularJS编译就完全正常了。

最后

  最后决定选择一个更开心的生活,所以给自己放个假。头一次,看着星光下闪烁的大海,听着潮水细微而深邃的波动,感觉微微腥咸的海风轻柔的拂面。然后手指在键盘上跳动,心情也变得轻快了。所谓幸福,不过如此。

AngularJS7那些不得不说的事故的更多相关文章

  1. angular学习第1步

    #### 最专业,最全面的angular的学习文档 https://www.jianshu.com/p/f0f81a63cbcb ### https://www.cnblogs.com/xiaowei ...

  2. CPU使用率终于正常了——记一次订餐系统事故处理

    引子 经过漫长的等待,儿子终于出生了.欣喜之余,就是各种手足无措,顾此失彼了.因为不懂,心里总是慌慌的,有点小毛病,恨不得一步就到医院. 婆媳育儿观念的差异,让心乱如麻的我,又成了风箱里的老鼠,两个不 ...

  3. MySQL选错索引导致的线上慢查询事故

    前言 又和大家见面了!又两周过去了,我的云笔记里又多了几篇写了一半的文章草稿.有的是因为质量没有达到预期还准备再加点内容,有的则完全是一个灵感而已,内容完全木有.羡慕很多大佬们,一周能产出五六篇文章, ...

  4. 【Java分享客栈】一个包装过简历的新同事写完微信支付引起事故后果断离职了

    前言 挺长时间没发文了,因为公司有一个紧急项目要赶进度,加班如吃饭喝水,久违的进入到码农的状态. 之所以抽空来发个文,是这个项目才刚上线,时间不长却因为一位新同事的代码引起了生产环境的事故,造成了一批 ...

  5. [erlang]一次erlcron崩溃引起的事故分析

    事故背景 由于误操作在erlcron设置了一个超过3个月后的定时任务.然后第二天之后发现每天的daily reset没有被执行,一些定时任务也没有被执行.瞬间感觉整个人都不好了,怎么无端端就不执行了呢 ...

  6. 事故记录:php-cgi进程过多导致系统资源耗尽

    事故现象:机房一台服务器运行一段时间后,突然发现系统资源即将被耗尽! 1)top命令查看一下系统的cpu ram swap的使用情况 由上图分析,可以看出1--共有602个进程,但其中有601个进程休 ...

  7. 关于工伤事故索赔计算很好用的一款APP

    关于工伤事故索赔计算很好用的一款APP.详细介绍工伤伤残等级评估 工伤计算器根据国家颁布<劳动能力鉴定 职工工伤与职业病致残等级>,通过关键字检索,快速评估工伤伤残等级. 软件说明:  1 ...

  8. 一个purge参数引发的惨案——从线上hbase数据被删事故说起

    在写这篇blog前,我的心情久久不能平静,虽然明白运维工作如履薄冰,但没有料到这么一个细小的疏漏会带来如此严重的灾难.这是一起其他公司误用puppet参数引发的事故,而且这个参数我也曾被“坑过”.   ...

  9. jvm 之 国际酒店 8 月 19 一次full GC 导致的事故

    事故经过: 1  15:18收到短信报警:国际酒店调用OMS queryGorderOrderList方法失败:成单接口调用OMS获取token失败. 2  查看checkList发现15:18开始发 ...

随机推荐

  1. Centos将yum源设置为阿里云的镜像源

    第一步:备份原有镜像源 mv /etc/yum.repo.d/Centos-Base.repo /etc/yum.repo.d/Centos-Base.repo.bak 第二步:下载阿里云的镜像源 w ...

  2. iOS开发之图片压缩实现

    使用下面两个方法,先按尺寸重绘图片,然后再降低品质上传图片data #pragma mark 裁剪照片 -(UIImage *)scaleToSize:(UIImage *)image size:(C ...

  3. git diff old mode 100644 new mode 100755

    今天执行git diff filename ,出现 old mode 100644 new mode 100755 的提示,如下图: 但是发现文件内容并没有发生改变 想起来中间执行过chmod  的操 ...

  4. 2018-2019 ICPC, NEERC, Southern Subregional Contest

    目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...

  5. FoxMail邮件设置

    最近部门变动,要求所有的沟通及交流都需要用企业邮箱,对于一般不喜欢看邮箱的我,经常会错过很多邮件.为了统一接收企业邮件及个人邮件,开始使用Foxmail(以前不喜欢整这些东西).下面分享一下FoxMa ...

  6. 1.初识Node.js

    Node.js基础知识大汇总 1.下载并安装npm,检测安装是否成功(在命令行输入node -v,看是否会输出对应版本号) 2.写一个hello world 程序. (1).打开notepad,新建一 ...

  7. css 控制横向布局,超出隐藏,滚动

    <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta cha ...

  8. node简介

    1. Node.js是什么? 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js ...

  9. window10 Docker仓库访问

    window10 Docker仓库访问 docer官网 docker仓库 windown10 安装docker可以参考 window10安装docker 配置了加速器以后还访问不了,点击托盘处dock ...

  10. Java当中的IO二

    1.大文件的读写方法 由于文件很大,我们不能一下子把文件内的所有内容都读取出来,所以只能一段一段的读取 注意:在关闭read()和write()的时候可能会产生IOException,需要对其进行处理 ...