精华内容
下载资源
问答
  • 可能很多刚接触 Spring Boot 的小伙伴都会有这样的疑问,Spring Boot 要怎么,要不要先 SSM?今天结合自己的经验,和大家说一说我的看法,也顺便推荐几个 Spring Boot 学习资料。 1.Spring Boot 是什么 我们刚...

    可能很多刚接触 Spring Boot 的小伙伴都会有这样的疑问,Spring Boot 要怎么学,要不要先学 SSM?今天结合自己的经验,和大家说一说我的看法,也顺便推荐几个 Spring Boot 学习资料。

    1.Spring Boot 是什么

    我们刚开始学习 JavaWeb 的时候,使用 Servlet/JSP 做开发,一个接口搞一个 Servlet ,很头大,后来我们通过隐藏域或者反射等方式,可以减少 Servlet 的创建,但是依然不方便。

    再后来,我们引入 Struts2/SpringMVC 这一类的框架,来简化我们的开发 ,和 Servlet/JSP 相比,引入框架之后,生产力确实提高了不少,但是用久了,又发现了新的问题,即配置繁琐易出错,要做一个新项目,先搭建环境,环境搭建来搭建去,就是那几行配置,不同的项目,可能就是包不同,其他大部分的配置都是一样的。

    Java 总是被人诟病配置繁琐代码量巨大,这就是其中一个表现。那么怎么办?Spring Boot 应运而生,Spring Boot 是 Pivotal 团队在 2013 年开始研发的一个基于 Spring 的全新框架,试图将 Spring 中臃肿的配置进行简化,使 Java 开发更加轻量与快速,这个框架非常活跃,官方也非常重视。

    Spring Boot 主要提供了如下功能:

    1. 为所有基于 Spring 的 Java 开发提供方便快捷的入门体验。
    2. 开箱即用,有自己自定义的配置就是用自己的,没有就使用官方提供的默认的。
    3. 提供了一系列通用的非功能性的功能,例如嵌入式服务器、安全管理、健康检测等。
    4. 绝对没有代码生成,也不需要XML配置。

    Spring Boot 的出现让 Java 开发又回归简单,因为确确实实解决了开发中的痛点,因此这个技术得到了非常广泛的使用,大概从 2017 年年初开始,Spring Boot 基本上面试必问,现在流行的 Spring Cloud 微服务也是基于 Spring Boot,因此,所有的 Java 工程师都有必要掌握好 Spring Boot。

    从 Spring Boot 诞生的过程中,我们可以看到:

    1. Spring Boot 并非另起炉灶,而是在现有的 Spring 框架的基础上整出来的,它把 Spring 中繁琐的配置进行了简化。
    2. Spring Boot 降低了 Spring 家族的使用门槛,使新手更易上手 Spring 框架。

    既然 Spring Boot 不是另起炉灶,那么 Spring Boot 学习要不要跳过 SSM 呢?听松哥来分析。

    2.要不要跳过 SSM

    这是很多人问我的一个问题,我的建议是:不要

    Spring Boot 基于 Spring,简单且容易上手,很多人想当然的跳过 SSM 直接上 Spring Boot。但是当我们细究 Spring Boot 中的自动化配置、条件注解、Java 配置等东西时,实在找不出太多新鲜玩意,Java 配置是 Spring3 开始提供的,条件注解 也是 Spring 中的东西,很多很多,都是 Spring 中就有的,只不过这些东西在 Spring Boot 时代大放异彩。

    也就是说,即使你跳过了 SSM 直接去学习 Spring Boot,实际上还是在学习 Spring 中的东西,那既然这样,我们还不如坐下来,老老实实把 Spring 过一遍。

    各个领域的开发工程师其实都会面临类似的问题,学习了一些优秀的封装框架之后,还有没有必要去学习底层?当然有必要!因为底层的东西可以让你深刻的理解你目前用的这个东西,也能让你在出问题时快速解决掉问题。

    其实无论你想搞什么技术,都要有牢固的基础知识,这些牢固的基础知识就像肥沃的土壤,可以孕育出各种不同技术方向的牛人,基础掌握好了,学什么框架都快。今天你跳过 SSM 直接学了 Spring Boot,假如有一天 Spring Boot 不行了,Pivotal 团队又基于 Spring 框架搞了一个新的框架出来,那你是不是又要去学一遍?但是如果你一开始就掌握了 Spring 的各种用法,无论基于它搞出来什么样的框架,你都能快速上手。更进一步,如果你研究透了 Spring 中的 AOP、Ioc/DI,你会发现很多框架大同小异,核心思想就是这些东西,那么你在学习 Spring 之外的框架,就会容易很多。

    如果你对 SSM 还不太熟悉的话,可以在公号后台分别回复 springspringmvcmybatis 获取松哥手敲 5 万余字的干货教程。

    3.都要学哪些

    那么 Spring Boot 学习都要学哪些东西呢?我这里列举了一个进阶路线:

    1. 最基础的当然是 Spring/SpringMVC 相关的东西了。
    2. 搭配各种页面模版的使用,例如 Jsp/Thymeleaf/Freemarker/Groovy Templates 等。
    3. 和各种 SQL 数据库的整合,以及一些常见的数据持久化框架,例如 JdbcTemplate、MyBatis、Jpa 等。
    4. 和各种 NoSQL 数据库的整合,例如 Redis、MongoDB、Elasticsearch 等。
    5. 搭配安全管理相关的知识点,例如 Spring Security、Shiro 等。
    6. 缓存的使用,例如 JCache、Ehcache 等。
    7. 和消息中间件的搭配整合,如 ActiveMQ、RabbitMQ、Kafka 等。
    8. 数据校验/定时任务/邮件发送等。
    9. 各种监控的使用。
    10. 结合 WebSocket 的使用。
    11. Spring Cloud 中相关组件。

    上面这些只是我列出来的一些比较常见的技术点,每个技术点都还可以延伸出很多其他的东西,大家可以结合自己的情况,按照顺序一个一个来学,这里边还涉及到很多第三方的框架,例如 Redis、MongoDB、RabbitMQ 等,Spring Boot 的出现只是让这些组件在和 Spring 家族的产品整合时变得更加方便,但是并不会简化这些组件原本的用法,所以,该学 Redis、该学 MongoDB、该学 RabbitMQ 等等,还是一个不能少。以 Redis 为例,学会了 Redis,学会了 Spring 整合 Redis,再回过头来看 Spring Boot 整合 Redis,那简直太 easy 了(大家在公众号后台回复 redis,有松哥手敲的 redis 教程)。

    当然,学习 Spring Boot 最终我们还是奔着快速开发和微服务去的,所以,像 Docker、Spring Cloud 等技术,也是需要去了解一下的。

    4.怎么学

    Spring Boot 发展到今天,网上的资料和图书现在是越来越多了。在看资料学习的同时,大家也要留意以下几个点:

    1. 多看源码。不同于其他全新的框架源码你可能会看懵了,由于 Spring Boot 是基于 Spring 的,所以只要你 Spring 基础扎实,看 Spring Boot 源码可以说是毫无压力。如果看 Spring Boot 源码觉得有压力,那可能你 Spring 基础不牢靠,这个时候不妨放下 Spring Boot,去复习下 Spring。
    2. 每当学会 Spring Boot 中的一个知识点,不妨想想这个功能在 Spring 框架中要如何使用,如何配置,两边都搞懂了,互相印证,加深对一个知识点的理解。
    3. 多多关注 Spring Boot 的发展动态。不同于传统的框架可能一年更新一两次,Spring Boot 更新非常频繁,二次每次更新都会带来一些好玩的东西,可能会有新的 API 加入进来,也可能会有旧的 API 失效,变化大,因此多多关注,避免掉坑。

    最后,我这里给大家列举几个我自己经常关注的几个资源。

    4.1 官方文档

    老实说,Spring Boot 的官方文档是我接触的所有官方文档中最条理清晰浅显易懂的,大家做开发,多多少少都接触过一些第三方的开放平台,很多平台的文档真是让人忍不住想吐槽,框架都做出来了,认认真真写个文档有那么难么?

    不过 Spring Boot 的官方文档可以算是非常非常友好了。虽然是英文的,但是实际上对英文要求并不高,连读带猜,其实很容易明白它的含义,我一般对 Spring Boot 中某个知识点有疑问的时候,都是首选官方文档,当前最新版的官方文档地址是:

    • https://docs.spring.io/spring-boot/docs/2.2.4.RELEASE/reference/html

    当然,如果你嫌官方文档打开慢,松哥也帮你下载好了最新版的 pdf,公众号后台回复 springboot2.2.4 可以获取。

    4.2 Spring 官方博客

    每次 Spring 或者 Spring Boot 发新版本,松哥都会去看一下新版本有哪些好玩的东西,增加了哪些内容。我不可能把源码读一遍然后总结出来它的变化,那一般是如何获取权威的第一手信息呢?关注 Spring 官方博客即可。

    打开 Spring 官网,在顶部菜单里有一个选项就是 Blog,关于 Spring 家族产品的任何更新计划,更新结果,都会在这里通知到大家。

    在这里插入图片描述

    松哥也推荐大家多多关注这个 Blog,一方面能够及时接收到一手信息,另一方面还能提高英语,一举两得。宅在家,泡一壶茶,细细的品一品这个网站,真的蛮不错。

    Blog 地址:

    • https://spring.io/blog

    4.3 中文资料

    说到中文资料,就不得不说松哥自己的在线教程和离线 pdf 文档了。手敲了 274 页教程,囊括了 Spring Boot2 常见的各种用法,即有离线的 pdf 供大家下载,也有在线的学习网站,这就是满满的诚意,还没下载 pdf 的小伙伴不要错过。

    在这里插入图片描述

    在线教程地址:

    • http://springboot.javaboy.org

    离线 pdf 下载文档,在公众号后台回复 springboot 获取百度网盘地址。

    4.4 学习案例

    除了这些文字性的东西之外,一些在线案例也至关重要。这里给大家推荐两个仓库,这两个仓库中的所有案例都是基于 Spring Boot2 来做的。

    首先就是我公众号上文章的配套案例:

    GitHub 地址:

    • https://github.com/lenve/javaboy-code-samples

    Gitee 地址:

    • https://gitee.com/lenve/javaboy-code-samples

    这个仓库中的大部分案例都是针对 Spring Boot 的,而且有一个好处就是这些案例都有对应的讲解文章,每个案例都对应一个文章,岂不美哉。

    在这里插入图片描述

    另一个仓库就是我整理的比较完善的一个仓库,但是就没有对应的讲解文章了:

    GitHub 地址:

    • https://github.com/lenve/javaboy-video-samples

    Gitee 地址:

    • https://gitee.com/lenve/javaboy-video-samples

    5.小结

    资料贵精不贵多,关键是要动手去学。大学时候,有的同学热衷于收集各种资料,电脑硬盘塞得满满的,但是就是不学,这些资料再多也没有用。

    展开全文
  • Angular 初学者快速上手教程

    万次阅读 多人点赞 2018-04-12 10:41:37
    本课程是一个系列基础教程,目标是带领读者上手实战,课程以新版本 Angular 的 3 个核心概念作为主线:组件、路由、模块,加上业务开发过程中必须用到的特性:工具、指令、表单、RxJS、i18n、测试,一共分为 9 部分...

    课程介绍

    本课程是一个系列基础教程,目标是带领读者上手实战,课程以新版本 Angular 的 3 个核心概念作为主线:组件、路由、模块,加上业务开发过程中必须用到的特性:工具、指令、表单、RxJS、i18n、测试,一共分为 9 部分,34 篇文章。

    除了组件、路由、模块这 3 个核心小节具有很强的关联性之外,其它内容都是完全独立的,您可以在用到的时候再翻阅。

    认真读完这个系列文章之后,您会深入理解新版本 Angular 的概念模型,具备使用 Angular 上手进行开发的基本能力。

    课程内容

    Angular 初学者快速上手教程导读

    课程特色

    你可能会问:Angular 的文章到处有,网上一大片,我为什么要来读你这个系列文章?

    这是非常好的一个问题,说明你对阅读内容有质量要求。

    如果是我,我也会问这个问题。

    整体上说,这个系列的文章有以下特色:

    1. 我会按照初学者一般的学习过程,用我自己的语言一步一步进行讲解。如你所知,最近的5年我一直在玩前端方面的东西,从 jQuery、SVG、ExtJS、Adobe Flex、Angular,这样一路玩过来。尤其是2016年,这一整年的时间我都代表 Angular 项目组在中国进行技术推广。在这5年,我在超过40家企业、开源组织、大学里面进行了大量演讲,在网络上发布了大量的视频和文章。在到处交流的过程中,认识了很多人,有经验丰富的后端开发者,也有新入行的初学者,他们跟我讲过很多自己的困惑。所以,这个系列文章里面的内容我至少反复讲过20遍以上,我会把常见的一些疑问融入在内容里面。

    2. 我会帮你扫平日常开发中常见的坑,这些坑大部分都是开发者们反馈给我的,或者说到我这里吐槽过的。举几个典型的例子:

      • 很多开发者到我这里来抱怨说,在 Windows 平台上安装 @angular/cli 会报很多 error,那是因为 @angular/cli 在 Windows 平台上面依赖 Python 和Visual Studio 环境,而很多开发者的机器上并没有安装这些东西。
      • node-sass 模块被墙的问题,强烈推荐使用 cnpm 进行安装,可以非常有效地避免撞墙。
      • 一些开发者来抱怨说 @angular/cli 在打包的时候加上 --prod 参数会报错,无法编译。这是一个很常见的问题,因为 @angular/cli 最新的版本经常会有 bug,只要在你项目的 package.json 里面降低一个小版本号就OK。
      • @angular/cli 默认生成的 karma.conf.js 配置文件里面采用了一个有 bug 的 html 报告生成器,导致 ng test 运行报错,我们需要把这个 reporter 改成mocha(摩卡)。
      • 有一些朋友说,本地开发的时候运行得很好,上线之后所有请求404。这也是一个常见的坑,因为你需要给 Web 容器配置一下处理 http 请求的规则,把前端路由扔回去交给 Angular 处理,请参考这份文档

      诸如此类的坑还有不少,我都是一个坑一个坑踩过来的。当然,我相信你自己也能踩过来,但是从节约时间的角度看,还是跟着我的思路走一遍更快不是吗?

    3. 这个系列的文章全部聚焦使用层面的话题,覆盖日常开发中使用频最高的特性。除非迫不得已,尽量不扯原理。长期以来,我发现有很多朋友的学习方式存在误区。比如:有一些人上来就去研究“变更检测”的原理,还有 RxJS 的原理,这种方式除了打击你自己的自信心之外并不能得到任何好处。因为你迟早会发现,在计算机领域,任何东西研究到最底层都和“算法”、“数据结构”、“设计模式”有关。而就我所知,很多朋友并不具备研究这些内容的基础知识,不过是白白浪费自己的时间而已。所以,我推荐采用更加务实一点的方案,首先学会如何使用,等用熟了,有时间、有闲情的时候再去研究那些底层的原理。设计发动机很难,但是学会开车并不难,对吧?所以我写这个系列的目标很简单,就是带你学会开车,而不是教你设计发动机。

    4. 这个系列的文章非常看重“概念模型”( Mental Model )的构建。我发现,很多开发者已经做过非常多的项目,但是当你跟他聊的时候,你很快就会发现他并没有掌握这门框架的精髓。打几个比方,当别人提到 Spring 的时候,你的大脑里面第一个想到一定是 DI、IOC、AOP 这些东西;当别人提到 Hibernate 或者 Mybatis 的时候,你的大脑里面立即会浮现出 ORM 的概念;当别人提到 React 的时候,你想到的应该是 VDom、JSX;当别人提到 jQuery 的时候,你首先想到的应该是$对吧?所以,你可以看到,任何一个成功的框架都有自己独创的“概念模型”,或者叫“核心价值”也可以。这是框架本身存在的价值,也是你掌握这门框架应该紧扣的主线,而不是上来就陷入到茫茫多的技术细节里面去。

    5. 文章里面所涉及到例子总数量大约200个左右,有少量例子来自官方文档,其它都是我自己一点一点手动敲出来的。我把这些例子分成了9个开源项目,它们互相独立,方便大家进行参考和练习。这些教学用的开源项目本身是免费的,列在这篇文章的尾部。

    Angular 的概念模型

    既然如此,问题就来了,新版本的 Angular 的核心概念是什么呢?

    非常简单,一切都是围绕着“组件”( Component )的概念展开的:

    enter image description here

    • Component(组件)是整个框架的核心,也是终极目标。“组件化”的意义有2个:第一是分治,因为有了组件之后,我们可以把各种逻辑封装在组件内部,避免混在一起;第二是复用,封装成组件之后不仅可以在项目内部复用,而且可以沉淀下来跨项目复用。
    • NgModule(模块)是组织业务代码的利器,按照你自己的业务场景,把组件、服务、路由打包到模块里面,形成一个个的积木块,然后再用这些积木块来搭建出高楼大厦。
    • Router(路由)的角色也非常重要,它有3个重要的作用:第一是封装浏览器的 History 操作;第二是负责异步模块的加载;第三是管理组件的生命周期。

    所以,在这个系列的文章里面,Component、NgModule、Router 加起来会占据绝大部分篇幅,而一些琐碎的小特性会被忽略掉。我相信,你只要紧扣“组件化”这个主线,就能站在一个很高的角度统摄全局,从而掌握到这门框架的精髓。

    适合阅读的人群

    这个系列的文章适合以下人群阅读:

    • Angular 新版本的初学者
    • 有 AngularJS 1.x 经验的开发者
    • 希望了解 Angular 新版本核心特性的开发者

    特别注意:这个系列的文章不是前端入门读物,你至少需要会一门编程语言,无论前端还是后端都可以,如果你曾经使用过一门前端框架,那就更好了。

    集中回答一些常见的问题

    浏览器兼容性

    关于 Angular 的浏览器兼容性,请看下图:

    enter image description here

    有一些国内的开发者会来争论兼容 IE8 的问题,我想给你两个事实:

    • 第一个事实是:截至2017年7月底,Chrome 的全球市场份额已经接近60%,加上 Firefox的12.28%,真的没有那么多人用 IE 了。

    enter image description here

    数据来源

    • 第二个事实是:天猫已经于2016年4月宣布放弃支持 IE6、7、8。而根据百度流量研究院的统计,IE8目前的整体市场份额已经下降到了9.31%:

    enter image description here

    数据来源

    不值得为了这么少的市场份额付出那么多的研发和维护成本。

    你完全可以以上两点事实去说服你的客户。

    命名约定

    老版本使用 AngularJS 指代,所有新版本都叫做 Angular。原因很好理解,因为老版本是用 JS 开发的,所以带一个 JS 后缀,而新版本是基于 TypeScript 的,带 JS 后缀不合适。

    关于 TypeScript

    这个系列的文章不会单独讲 TypeScript,正如我一直强调的:TypeScript 不难,JavaScript 才难。你跟着我的思路,TypeScript 绝对不会成为你学习 Angular 的障碍。相反,一旦你写熟练了之后,TypeScript 可以非常有效地提升编码效率和程序可读性。

    关于版本号

    根据官方的解释,Angular 从2.0之后会保证向下兼容,每隔半年会升级一个大版本,只有升级大版本的时候才会做一些 breaking change。

    所以这个系列文章里面不再强调版本号,涉及到的所有实例代码都基于目前(2017-10)最新的4.x版本。

    内容列表

    这个系列文章一共分11章,34个小节。

    • 1 搭建开发环境
    • 2-1 组件概述
    • 2-2 把 CSS 预编译器改成 SASS
    • 2-3 模板
    • 2-4 组件间通讯
    • 2-5 生命周期钩子
    • 2-6 动效
    • 2-7 动态组件
    • 2-8 ShadowDOM
    • 2-9 内容投影
    • 2-10 @ContentChild@ContentChildren
    • 2-11 @ViewChild 与 @ViewChildren
    • 2-12 与 Polymer 封装组件的方式简单对比
    • 2-13 封装并发布你自己的组件库
    • 3-1 指令简介
    • 3-2 自定义指令
    • 3-3 直接在组件里面操作 DOM
    • 4 模块 @NgModule
    • 5-1 路由概述
    • 5-2 路由基本用法
    • 5-3 模块预加载
    • 5-4 路由守卫
    • 5-5 多重出口
    • 6-1 表单快速上手
    • 6-2 双向数据绑定
    • 6-3 表单校验
    • 6-4 模型驱动型表单
    • 6-5 动态表单
    • 7 服务
    • 8 RxJS 快速上手教程
    • 9 国际化
    • 10 自动化测试
    • 11 参考资源

    本系列课程对应的所有示例项目列表:

    1. https://gitee.com/mumu-osc/learn-component
    2. https://gitee.com/mumu-osc/learn-directive
    3. https://gitee.com/mumu-osc/learn-router
    4. https://gitee.com/mumu-osc/learn-module
    5. https://gitee.com/mumu-osc/learn-form
    6. https://gitee.com/mumu-osc/learn-service
    7. https://gitee.com/mumu-osc/learn-test
    8. https://gitee.com/mumu-osc/learn-webpack
    9. https://github.com/damoqiongqiu/angular-seo

    最后是那一句套话:水平有限,错漏难免,欢迎指正。可以在我的读者圈里跟我沟通交流。

    第1课:搭建开发环境

    NodeJS

    enter image description here

    2009年,NodeJS 发布了第一个版本,标志着前端开发正式告别了刀耕火种的原始状态,开始进入工业化时代。

    在 NodeJS 出现之前,前端开发领域有很多事情我们是做不到的,例如:

    • JS 代码的合并、压缩、混淆。
    • CSS 预处理。
    • 前端自动化测试。

    而这一切在 NodeJS 出现之后都得到了很好的解决:

    • 对 JS 代码的预处理经历了 Grunt、Gulp 的短暂辉煌之后,终于在 webpack 这里形成了事实标准的局面。
    • CSS 的预处理也从 LESS 发展到了 SASS。
    • 自动化测试一直是前端开发中的一个巨大痛点,由于前端在运行时严重依赖浏览器环境,导致我们一直无法像测试后端代码那样可以去编写测试用例。在有了 NodeJS 之后,我们终于有了 Karma+Jasmine 这样的单元测试组合,也有了基于 WebDriverJS 这样的可以和浏览器进行通讯的集成测试神器。

    就前端开发目前整体的状态来说,无论你使用什么框架,NodeJS、webpack、SASS、Karma+Jasmine、WebDriverJS 这个组合是无论如何绕不过去的。

    @angular/cli

    enter image description here

    在开发 Angular 应用的时候,当然也离不开大量基于 NodeJS 的工具,我们需要 TypeScript compiler、webpack、Karma、Jasmine、Protracter 等模块。

    有相关经验的开发者都知道,自己从头开始去搭建一套基于 webpack 的开发环境是一件非常麻烦的事情。很多初学者在搭建环境这一步上面消耗了过多的精力,导致学习热情受到了沉重的打击。

    当团队规模比较大的时候,在每个人的机器上配置环境需要消耗大量的时间。有一些团队为了避开这个坑,利用 Docker 来做开发环境的同步和版本升级,看起来也是一个非常不错的方案。

    Angular 项目组从一开始就注意到了这个问题,所以有了 @angular/cli 这个神器,它的底层基于 webpack,集成了以上提到的所有 NodeJS 组件。你只要装好 @angular/cli 就够了,而不需要自己从头一步一步安装那些 NodeJS 插件。

    当然,在安装 @angular/cli 之前你需要先把 NodeJS 安装好,请到官方网站下载安装包: https://nodejs.org/ ,安装过程和普通软件没有区别。装好 NodeJS 之后就可以安装 @angular/cli 了,由于 npm 会自动访问海外的服务器,所以强烈推荐使用 cnpm 进行安装:

    npm i -g cnpm --registry=https://registry.npm.taobao.orgcnpm i -g @angular/cli

    cnpm 是淘宝发布的一款工具,会自动把 npm 上面的所有包定时同步到国内的服务器上来,cnpm 本身也是一款 NodeJS 模块。

    @angular/cli 安装成功之后你的终端里面将会多出一个名叫 ng 的命令,敲下 ng,将会显示完整的帮助文档:

    enter image description here

    创建第一个项目

    我们来创建第一个入门项目 HelloAngular,请在你的终端里面运行:

    ng new HelloAngular

    @angular/cli 将会自动帮你把目录结构创建好,并且会自动生成一些模板化的文件,就像这样:

    enter image description here

    请特别注意:@angular/cli 在自动生成好项目骨架之后,会立即自动使用 npm 来安装所依赖的 Node 模块,所以这里我们要 Ctrl+C 终止掉,然后自己进入项目的根目录,使用 cnpm 来进行安装。

    enter image description here

    安装完成之后,使用 ng serve 命令启动项目:

    enter image description here

    打开你的浏览器,访问默认的4200端口,看到以下界面说明环境 OK 了:

    enter image description here

    请注意:

    • 这里是 serve,不是 server,我看到一些初学者经常坑在这个地方。
    • 如果你需要修改端口号,可以用 ng serve --port ****来进行指定。
    • 如果你想让编译的包更小一些,可以使用 ng serve --prod,@angular/cli 会启用 TreeShaking 特性,加了参数之后编译的过程也会慢很多。所以,在正常的开发过程里面请不要加 --prod 参数。
    • ng serve 是在内存里面生成项目,如果你想看到项目编译之后的产物,请运行 ng build。构建最终产品版本可以加参数,ng build --prod。

    ng 提供了很多非常好用的工具,除了可以利用 ng new 来自动创建项目骨架之外,它还可以帮助我们创建 Angular 里面所涉及到的很多模块,最常用的几个如下:

    • 自动创建组件:ng generate component MyComponent,可以简写成 ng g c MyComponent。创建组件的时候也可以带路径,比如:ng generate component mydir/MyComponent
    • 自动创建指令:ng g d MyDirective
    • 自动创建服务:ng g s MyService
    • 构建项目:ng build,如果你想构建最终的产品版本,可以用 ng build --prod

    更多的命令和参数请在终端里面敲 ng 仔细查看,尽快熟悉这些工具可以非常显著地提升你的编码效率。

    一些常见的坑

    @angular/cli 这种“全家桶”式的设计带来了很大的方便,同时也有一些人不太喜欢,因为很多底层的东西被屏蔽掉了,开发者不能天马行空地自由发挥。比如:@angular/cli 把底层 webpack 的配置文件屏蔽掉了,很多喜欢自己手动配 webpack 的开发者就感到很不爽。

    对于国内的开发者来说,上面这些其实不是最重要的,国内开发者碰到的坑主要是由两点引起的:

    1. 第一点是网络问题:比如 node-sass 这个模块你很有可能就装不上,原因你懂的。
    2. 第二点是开发环境导致的问题:国内使用 Windows 平台的开发者比例依然巨大,而 @angular/cli 在 Windows 平台上有一些非常恶心的依赖,比如它需要依赖 python 环境、Visual Studio 环境。

    所以,如果你的开发平台是 Windows,请特别注意:

    1. 如果你知道如何给 npm 配置代理,也知道如何翻墙,请首选 npm 来安装 @angular/cli。
    2. 否则,请使用 cnpm 来安装 @angular/cli,原因有三:1、cnpm 的缓存服务器在国内,你装东西的速度会快很多;2、用 cnpm 可以帮你避开某些模块装不上的问题,因为它在服务器上面做了缓存;3、cnpm 还把一些包都预编译好了缓存在服务端,不需要把源码下载到你本地去编译,所以你的机器上可以没有那一大堆麻烦的环境。
    3. 如果安装失败,请手动把 node_modules 目录删掉重试一遍,全局的@angular/cli 也需要删掉重装,cnpm uninstall -g @angular/cli。
    4. 如果 node_modules 删不掉,爆出路径过长之类的错误,请尝试用一些文件粉碎机之类的工具强行删除。
    5. 最新版本的 @angular/cli 经常会有 bug,尤其是在 Windows 平台上面,所以请不要追新版本追太紧。如果你发现了莫名其妙的问题,请尝试降低一个主版本试试。这一点非常重要,很多初学者会非常困惑,代码什么都没改,就升级了一下环境,然后就各种编译报错。
    6. 对于 Mac 用户或者 *nix 用户,请特别注意权限问题,命令前面最好加上 sudo,保证有 root 权限。
    7. 无论你用什么开发环境,安装的过程中请仔细看 log。很多朋友没有看 log 的习惯,报错的时候直接懵掉,根本不知道发生了什么。

    VS Code

    enter image description here

    如你所知,一直以来,前端开发领域并没有一款特别好用的开发和调试工具。

    • WebStorm 很强大,但是吃资源很严重。
    • Sublime Text 插件很多,可惜要收费,而国内的企业还没有养成花钱购买开发工具的习惯。
    • Chrome 的开发者工具很好用,但是要直接调试 TypeScript 很麻烦。

    所以,Visual Studio Code(简称 VS Code)才会呈现出爆炸性增长的趋势。它是微软开发的一款前端编辑器,完全开源免费。VS Code 底层是 Electron,界面本身是用 TypeScript 开发的。对于 Angular 开发者来说,当然要强烈推荐 VS Code。最值得一提的是,从1.14开始,可以直接在 VS Code 里面调试 TypeScript 代码。

    第一步:环境配置

    • 确保你的 Chrome 安装在默认位置。
    • 确保你的 VS Code 里面安装了 Debugger for Chrome 这个插件。
    • 把 @angular/cli 安装到全局空间 npm install -g @angular/cli,国内用户请使用 cnpm 进行安装。注意,你最好升级到最新版本的 @angular/cli,避免版本兼容问题。
    • 用 @angular/cli 创建新项目 ng new my-app,本来就已经用 @angular/cli 创建的项目请忽略这一步,继续往下走,因为只要是 cli 创建的项目,后面的步骤都是有效的。
    • 用 VS Code 打开项目,进入项目根目录

    第二步:配置 launch.json

    enter image description here

    请参照以上步骤打开 launch.json 配置文件。

    enter image description here

    请把你本地 launch.json 文件里面的内容改成这样:

    {    "version": "0.2.0",    "configurations": [        {            "type": "chrome",            "request": "launch",            "name": "Chrome",            "url": "http://localhost:4200",            "webRoot": "${workspaceRoot}"        }    ]}

    第三步:开始 Debug

    在你的 app.component.ts 的构造函数里面打个断点,我本地是这样打断点的:

    enter image description here

    打开终端,进入项目根目录,运行 ng serve 启动项目,然后从 VS Code 的 debug 界面启动 Chrome

    enter image description here

    注意,你可能需要 F5 刷新一下 Chrome 才能进入断点!

    enter image description here

    小结

    目前,无论你使用什么前端框架,都必然要使用到各种 NodeJS 工具,Angular 也不例外。与其它框架不同,Angular 从一开始就走的“全家桶”式的设计思路,因此 @angular/cli 这款工具里面集成了日常开发需要使用的所有 Node 模块,使用 @angular/cli 可以大幅度降低搭建开发环境的难度。

    第2-1课:组件:概述

    enter image description here

    几乎所有前端框架都在玩“组件化”,而且最近都不约而同地选择了“标签化”这种思路,Angular 也不例外。

    对新版本的 Angular 来说,一切都是围绕着“组件化”展开的,组件是 Angular 的核心概念模型。

    以下是一个最简单的 Angular 组件定义:

    enter image description here

    • @Component:这是一个 Decorator(装饰器),其作用类似于 Java 里面的注解。Decorator 这个语言特性目前(2017-10)处于 Stage 2(草稿)状态,还不是 ECMA 的正式规范。
    • selector:组件的标签名,外部使用者可以这样来使用这个组件:<app-root>。默认情况下,ng 命令生成出来的组件都会带上一个 app 前缀,如果你不喜欢,可以在 angular-cli.json 里面修改 prefix 配置项,设置为空字符串将会不带任何前缀。
    • templateUrl:引用外部的 HTML 模板。如果你想直接编写内联模板,可以使用 template,支持 ES6 引入的“模板字符串”写法
    • styleUrls:引用外部 CSS 样式文件,这是一个数组,也就意味着可以引用多份 CSS 文件。
    • export class AppComponent:这是 ES6 里面引入的模块和 class 定义方式。

    本节完整的实例代码请参见这里

    第2-2课:组件:把 CSS 预编译器改成 SASS

    enter image description here

    SASS 是一款非常好用的 CSS 预编译器,Bootstrap 官方从4.0开始已经切换到了 SASS。

    目前(2017-10),@angular/cli 创建项目的时候没有自动使用 SASS 作为预编译器,我们需要自己手动修改一些配置文件,请按照以下步骤依次修改:

    • angular-cli.json 里面的 styles.css 后缀改成 .scssenter image description here当你后面再使用 ng g c *** 自动创建组件的时候,默认就会生成 .scss 后缀的样式文件了。

    • angular-cli.json 里面的 styleExt 改成 .scssenter image description here

    • src 下面 style.css 改成 style.scssenter image description here

    • app.component.scssenter image description here

    • app.component.ts 里面对应修改enter image description here

    改完之后,重新 ng serve,打开浏览器查看效果。

    小结

    本节完整的实例代码请参见这里

    SASS 的 API 请参考官方网站

    SASS 只是一个预编译器,它支持所有 CSS 原生语法。利用 SASS 可以提升你的 CSS 编码效率,增强 CSS 代码的可维护性,但是千万不要幻想从此就可以不用学习 CSS 基础知识了。

    第2-3课:组件:模板

    enter image description here

    模板是编写 Angular 组件最重要的一环,你至少需要深入理解以下知识点才能玩转 Angular 模板:

    1. 对比各种 JS 模板引擎的设计思路
    2. Mustache(八字胡)语法
    3. 模板内的局部变量
    4. 属性绑定、事件绑定、双向绑定
    5. 在模板里面使用结构型指令 *ngIf、*ngFor、ngSwitch
    6. 在模板里面使用属性型指令 NgClass、NgStyle、NgModel
    7. 在模板里面使用管道格式化数据

    对比各种 JS 模板引擎的设计思路

    几乎每一款前端框架都会提供自己的模板语法,在 jQuery 如日中天的时代,有 Handlebars 那种功能超强的模板。最近有 React 推崇的 JSX 模板写法,当然还有 Angular 提供的那种与“指令”紧密结合的模板语法。

    综合来说,无论是哪一种前端模板,大家都比较推崇“轻逻辑”( logic-less )的设计思路。

    何为“轻逻辑”?

    简而言之,所谓“轻逻辑”就是说,你不能在模板里面编写非常复杂的 JavaScript 表达式。比如,Angular 的模板语法就有规定:

    • 你不能在模板里面 new 对象
    • 不能使用=、+=、-=这类的表达式
    • 不能用++、--运算符
    • 不能使用位运算符

    为什么要“轻逻辑”?

    有一个非常重要的原因,比如你编写了以下 Angular 模板:

    <ul>    <li *ngFor="let race of races">        {{race.name}}    </li></ul>

    很明显,浏览器不认识 *ngFor 和 {{...}} 这种语法,所以必须在浏览器里面进行“编译”,获得对应的模板函数,然后再把数据传递给模板函数,最终结合起来获得一堆 HTML 标签,然后才能把这一堆标签插入到 DOM 树里面去。

    如果启用了 AOT,处理的步骤有一些变化,@angular/cli 会对模板进行“静态编译”,避免在浏览器里面动态编译的过程。

    而 Handlebars 这种模板引擎完全是运行时编译模板字符串的,你可以编写以下代码:

    //定义模板字符串var source=`<ul>    {{#each races}}        <li>{{name}}</li>    {{/each}}</ul>`;//在运行时把模板字符串编译成JS函数var templateFn=Handlebars.compile(source);//把数据传给模板函数,获得最终的HTMLvar html=templateFn([    {name:'人族'},    {name:'神族'},    {name:'虫族'}]);

    注意到 Handlebars.compile 这个调用了吧?这个地方的本质是在运行时把模板字符串“编译”成了一个 JS 函数。

    鉴于 JS 解释执行的特性,你可能会担忧这里会有性能问题。这种担忧是合理的,但是 Handlebars 是一款非常优秀的模板引擎,它在内部做了各种优化和缓存处理。模板字符串一般只会在第一次被调用的时候编译一次,Handlebars 会把编译好的函数缓存起来,后面再次调用的时候会从缓存里面获取,而不会多次进行“编译”。

    上面我们多次提到了“编译”这个词,所以很显然这里有一个东西是无法避免的,那就是我们必须提供一个 JS 版的“编译器”,让这个“编译器”运行在浏览器里面,这样才能在运行时把用户编写的模板字符串“编译”成模板函数。

    有一些模板引擎会真的去用 JS 编写一款“编译器”出来,比如 Angular 和 Handlebars,它们都真的编写了一款 JS( TS )版的编译器。而有一些简单的模板引擎只是用正则表达式做了字符串替换而已,显得特别简陋。这种简陋的模板引擎对模板的写法有非常多的限制,因为它不是真正的编译器,能支持的语法特性非常有限。

    所以,评估一款模板引擎的强弱,最核心的东西就是评估它的“编译器”做得怎么样。但是不管怎么说,毕竟是 JS 版的“编译器”,我们不可能把它做得像 g++ 那么强大,也没有必要做得那么强大,因为这个 JS 版的编译器需要在浏览器里面运行,搞得太复杂浏览器拖不动!

    以上就是为什么大多数模板引擎都要强调“轻逻辑”的最根本原因。

    对于 Angular 来说,强调“轻逻辑”还有另一个原因:在组件的整个生命周期里面,模板函数会被执行很多次。你可以想象, Angular 每次要刷新组件的外观的时候,都需要去调用一下模板函数,如果你在模板里面编写了非常复杂的代码,一定会增加渲染时间,用户一定会感到界面有“卡顿”。

    人眼的视觉延迟大约是100ms到400ms之间,如果整个页面的渲染时间超过400ms,界面基本上就卡得没法用了。有一些做游戏的开发者会追求60fps刷新率的细腻感觉,60分之1秒约等于16.7ms,如果 UI 整体的渲染时间超过了16.7ms,就没法达到这个要求了。

    轻逻辑( logic-less )带来了效率的提升,也带来了一些不方便,比如很多模板引擎都实现了 if 语句,但是没有实现 else,所以开发者们在编写复杂业务逻辑的时候模板代码会显得非常啰嗦。

    目前来说,并没有完美的方案能同时兼顾运行效率和语法表现能力,这里只能取一个平衡。

    Mustache 语法

    Mustache 语法也就是你们说的双花括号语法{{...}},老外觉得它像八字胡子,很奇怪啊,难道老外喜欢侧着头看东西?

    好消息是,很多模板引擎都接受了 Mustache 语法,这样一来学习量又降低了不少,开心吧?

    关于 Mustache 语法,你需要掌握3点:

    1. 它可以获取到组件里面定义的属性值。
    2. 它可以自动计算简单的数学表达式,例如:加减乘除、取模。
    3. 它可以获得方法的返回值。

    请依次看例子:

    插值语法关键代码实例:

    <h3>    欢迎来到{{title}}!</h3>
    public title = '假的星际争霸2'; 

    简单的数学表达式求值:

    <h3>1+1={{1+1}}</h3>

    调用组件里面定义的方法:

    <h3>可以调用方法{{getVal()}}</h3>
    public getVal():any{    return 65535;}

    模板内的局部变量

    <input #heroInput><p>{{heroInput.value}}</p>

    有一些朋友会追问,如果我在模板里面定义的局部变量和组件内部的属性重名会怎么样呢?

    如果真的出现了重名,Angular 会按照以下优先级来进行处理:

    模板局部变量 > 指令中的同名变量 > 组件中的同名属性。

    这种优先级规则和 JSP 里面的变量取值规则非常类似,对比一下很好理解对不对?你可以自己写代码测试一下。

    属性绑定

    属性绑定是用方括号来做的,写法:

    <img [src]="imgSrc" />
    public imgSrc:string="./assets/imgs/1.jpg";

    很明显,这种绑定是单向的。

    事件绑定

    事件绑定是用圆括号来做的,写法:

    <button class="btn btn-success" (click)="btnClick($event)">测试事件</button>

    对应 Component 内部的方法定义:

    public btnClick(event):void{    alert("测试事件绑定!");}

    双向绑定

    双向绑定是通过方括号里面套一个圆括号来做的,模板写法:

    <font-resizer [(size)]="fontSizePx"></font-resizer>

    对应组件内部的属性定义:

    public fontSizePx:number=14;

    AngularJS 是第一个把“双向数据绑定”这个特性带到前端来的框架,这也是 AngularJS 当年最受开发者追捧的特性,之一。

    根据 AngularJS 团队当年讲的故事,“双向数据绑定”这个特性可以大幅度压缩前端代码的规模。大家可以回想一下 jQuery 时代的做法,如果要实现类似的效果,是不是要自己去编写大量的代码?尤其是那种大规模的表单,一大堆的赋值和取值操作,都是非常丑陋的“面条”代码,而有了“双向数据绑定”特性之后,一个绑定表达式就搞定。

    目前,主流的几款前端框架都已经接受了“双向数据绑定”这个特性。

    当然,也有一些人不喜欢“双向数据绑定”,还有人专门写了文章来进行批判,也算是前端一景。

    在模板里面使用结构型指令

    Angular 有3个内置的结构型指令:*ngIf、*ngFor、ngSwitch。ngSwitch 的语法比较啰嗦,使用频率小一些。

    *ngIf 代码实例:

    <p *ngIf="isShow" style="background-color:#ff3300">显示还是不显示?</p><button class="btn btn-success" (click)="toggleShow()">控制显示隐藏</button>
    public isShow:boolean=true;public toggleShow():void{    this.isShow=!this.isShow;}

    *ngFor 代码实例:

    <li *ngFor="let race of races;let i=index;">    {{i+1}}-{{race.name}}</li>
    public races:Array<any>=[    {name:"人族"},    {name:"虫族"},    {name:"神族"}];

    *ngSwitch 代码实例:

    <div [ngSwitch]="mapStatus">    <p *ngSwitchCase="0">下载中...</p>    <p *ngSwitchCase="1">正在读取...</p>    <p *ngSwitchDefault>系统繁忙...</p></div>
    public mapStatus:number=1;

    特别注意:一个 HTML 标签上只能同时使用一个结构型的指令。

    因为“结构型”指令会修改 DOM 结构,如果在一个标签上使用多个结构型指令,大家都一起去修改 DOM 结构,到时候到底谁说了算?

    那么需要在同一个 HTML 上使用多个结构型指令应该怎么办呢?有两个办法:

    • 加一层空的 div 标签
    • 加一层<ng-container>

    在模板里面使用属性型指令

    使用频率比较高的3个内置指令是:NgClass、NgStyle、NgModel。

    NgClass 使用案例代码:

    <div [ngClass]="currentClasses">同时批量设置多个样式</div><button class="btn btn-success" (click)="setCurrentClasses()">设置</button>
    public currentClasses: {};public canSave: boolean = true;public isUnchanged: boolean = true;public isSpecial: boolean = true;setCurrentClasses() {    this.currentClasses = {        'saveable': this.canSave,        'modified': this.isUnchanged,        'special': this.isSpecial    };}
    .saveable{    font-size: 18px;} .modified {    font-weight: bold;}.special{    background-color: #ff3300;}

    NgStyle 使用案例代码:

    <div [ngStyle]="currentStyles">    用NgStyle批量修改内联样式!</div><button class="btn btn-success" (click)="setCurrentStyles()">设置</button>
    public currentStyles: {}public canSave:boolean=false;public isUnchanged:boolean=false;public isSpecial:boolean=false;setCurrentStyles() {    this.currentStyles = {        'font-style':  this.canSave      ? 'italic' : 'normal',        'font-weight': !this.isUnchanged ? 'bold'   : 'normal',        'font-size':   this.isSpecial    ? '36px'   : '12px'    };}

    ngStyle 这种方式相当于在代码里面写 CSS 样式,比较丑陋,违反了注意点分离的原则,而且将来不太好修改,非常不建议这样写。

    NgModel 使用案例代码:

    <p class="text-danger">ngModel只能用在表单类的元素上面</p>    <input [(ngModel)]="currentRace.name"><p>{{currentRace.name}}</p>
    public currentRace:any={name:"随机种族"};

    请注意,如果你需要使用 NgModel 来进行双向数据绑定,必须要在对应的模块里面 import FormsModule。

    管道

    管道的一个典型作用是用来格式化数据,来一个最简单的例子:

    {{currentTime | date:'yyyy-MM-dd HH:mm:ss'}}
    public currentTime: Date = new Date();

    Angular里面一共内置了12个管道:

    enter image description here

    在复杂的业务场景里面,12个管道肯定不够用,如果需要自定义管道,请查看这里的例子

    管道还有另一个典型的作用,就是用来做国际化,后面有一个独立的小节专门演示 Angular 的国际化写法。

    小结

    本节完整可运行的实例代码请参见这里请检出 template 分支。

    第2-4课:组件:组件间通讯
    第2-5课:组件:生命周期钩子
    第2-6课:组件:动效
    第2-7课:组件:动态组件
    第2-8课: 组件:ShadowDOM
    第2-9课:组件:内容投影
    第2-10课:组件:@ContentChild 和 @ContentChildren
    第2-11课:组件:@ViewChild 与 @ViewChildren
    第2-12课:与 Polymer 封装组件的方式简单对比
    第2-13课:封装并发布你自己的组件库
    第3-1课:指令
    第3-2课:自定义指令
    第3-3课:在组件里面直接操作DOM
    第4课:模块 @NgModule
    第5-1课:路由:概述
    第5-2课:路由:基本用法
    第5-3课:路由:模块预加载
    第5-4课: 路由:路由守卫
    第5-5课:路由:多重出口
    第6-1课:表单:快速上手
    第6-2课: 表单:双向数据绑定
    第6-3课:表单:表单校验
    第6-4课:表单:模型驱动型表单
    第6-5课:表单:动态表单
    第7课:服务
    第8课: RxJS 快速上手教程
    第9课:国际化
    第10课:前端自动化测试
    第11课:参考资源

    阅读全文: http://gitbook.cn/gitchat/column/59dae2081e6d652a5a9c3603

    展开全文
  • 入职新公司后如何快速上手项目

    千次阅读 多人点赞 2021-07-23 00:01:44
    一个项目少说三五人,多则三五十人开发,行业里经常流传一句话在小公司你的技术提升会非常快,因为什么东西都得你来弄,不会也得快速去了就可以直接运用到项目中,这样技术就提升的非常快。但是你在开发人员...

    前言

    程序员这个行业的流动性是非常高的,每进入一家新公司,工作内容都是全新的。

    假如你是刚毕业没关系,如果你有3年以上的工作经验,就不可能让你长时间慢慢地熟悉这个项目。

    只能在最短的时间内,快速了解项目,快速上手。

    接下来咔咔就用自己的经验和大家聊聊入职一家工作后应该如何快速上手。

    一、正式上岗

    第一天根据Offer的入职时间到人事报到完成入职手续。

    当你完成入职手续后,人事会把你带到你的工位,此时你的岗位已被确定,下一步就是正式开始工作。

    你需要下载所有工作所需的环境,这里咔咔建议大家都注册一个谷歌账号,将平时用到的东西都保存到标签里边。

    这样无论换电脑还是换工作都能直接登录谷歌账号进行书签同步,可以快速完成所有前期工作。

    然后去找你的组长或者主管要开发资料,开发资料无非就是接口文档、数据库信息、代码库、代码规范、建表规范这几种,开发需要这几个资料也就行了。

    在获取资料之后,首先将代码拉下来,根据文档先使项目运行,如果该项目在运行过程中出现任何问题,需要对其记录,因为你不可能只部署这一次,将这些记录下来便于你后期查阅。

    如果你根本把项目运行不起来,此时就不要自己瞎捣鼓了,赶紧去找同组的小伙伴进行救助。别因好面不愿问,不知道怎么弄就问。不怕工作上有问题,就怕你没问题。

    尽量在第一天就把项目在你的本地跑起来,可以做简单的调试工作。

    下班回家后再做一件事,在家里重新搭一份项目以防不时之需。要知道bug可不会专挑你在公司的时间冒出来。

    只要在第一天解决如下问题即可。

    • 配置本地环境
    • 向上级领导索要开发资料
    • 在本地运行并调试项目

    二、考虑做什么而不是怎样做

    你可以想一下在上家公司的工作,要在一个新的项目上开始写东西,要先知道那些东西呢?

    大部分小伙伴反应都是技术,作为开发,当然技术是第一位的,于是一个猛子就扎进了代码中,然后,研究代码实现过程。

    这个方法是不被推荐的,技术方面当然也需要了解, 但是第二天就不应该这样做。

    作为技术都是一个bug一个bug改过来的,在脑海里已经潜移默化了。总在考虑如何做的问题,但我们首先要理解的是做什么

    做什么这个问题,只有产品才能给你最好的解释,所有的业务都是在产品中一点点构建。

    找到产品并获得研发排期。因此,优先级最高的就是业务。了解业务和技术都是你进入一家新公司必备的工作。

    为何要先让你解业务?想象一下,如果让你先阅读代码,然后推演出一个业务,你觉得吃力吗?

    但是,当你了解业务情况时,你可以推演出基本的代码框架。正因为如此,许多公司都会进行入职培训,让你熟悉项目的运作。

    并且一个产品都是协作完成的,所以,还要看看其他组员遇到的问题是如何一起合作完成的,此时就需要了解团队是如何工作的,

    通常,在刚入职的前几天是不会给你安排工作的,这些时间是为了让你充分了解项目和各部门的工作。

    因此,千万不要用这几天的时间来划水。一旦你用来划水,当给你项目排期时就会一无所知,做东西没有思路,无从下手。从而导致心态不好,越来越难融入新的环境中。

    三、拿到数据库应该怎么做

    进来不断接触两个新的项目,虽然一个是Phalcpn框架、另一个是原生。令我恐惧的并非代码,而是数据库。

    通常接到的项目大部分都是之前开发好的,目前的工作或者是优化或者是维护。

    可以毫不夸张地说,咔咔见过一个项目有2500多张表,这是目前为止在项目中遇到过最多的表了。

    在这个项目中,进行了多库连接,将2500张表分别存储到了3个数据库,本身表就很麻烦了,这还分了三个。

    所以说你修改这样的项目,代码估计就五六行,找表得找好久。

    进入正题,假设你拿到的项目数据库是这个样子的。

    数据库表

    这张表结构很熟悉吧!这是MySQL 的系统表,这里只是做个演示。

    假如你接手的项目数据库是这样的,那么你就要好好想一想,是否上辈子做了太多坏事。

    要是真像上图那样的情况,谁也没辙自己加班加点处理吧!

    但是,如果你给数据库中所有的表和字段都添加了注释,则该项目的下一位接手者将变得非常容易上手。

    执行MySQL查询

    select
    TABLE_NAME,
    TABLE_COMMENT
    from
    INFORMATION_SCHEMA.Tables
    where
    table_schema = 'enen''
    

    查询结果

    通过上图可以很清楚地了解每一张表是干什么的!通常的数据库设计都与项目模块关联的。

    即使有出入也不会太大,所以说根据模块来找数据表也是没问题。

    假如你接手一个新项目,拿到这样的数据库会不会很开心呢!

    因此,在日常开发过程中,该给注释给注释不要吝啬你几秒钟的时间,让自己看或接手人看都很友好。

    将所有表的注释整理出来后,大概看一眼都什么意思不用去刻意的记,上手做几天业务就熟悉的差不多了。

    在写业务时必不可少的就是查看表注释,查看表注释的方式非常多,咔咔给大家介绍几种。

    第一种方式就是直接在客户端中查看,十分方便

    使用客户端

    当然你也可以直接使用SQL来查看。

    select 
    COLUMN_NAME 字段名,
    column_comment 字段说明,
    column_type 字段类型
    from information_schema.columns 
    where table_schema = 'enen'
    and table_name = 'fa_admin' ; 
    

    使用SQL语句

    然后可以把使用到的表字段注释复制出来,整理一份你自己的数据库字典,方便后期开发使用。

    四、开始做一些简单的功能

    通常到第四天,你的组长就会给你指派一些简单的任务,此时你应该很兴奋,因为你终于可以参与这个项目了。

    在得到分配的任务之后,对应到项目中简单的过一遍,然后在开发过程中每个任务都写一个实现文档。

    最初的文档可以是标题、需求、相应的代码文件路径、所需的表、字段注释,把这些工作都准备好之后,就别急着开发。那这时候应该怎么做呢?

    首先找到产品对需求,把你对任务的理解跟产品对接一遍,确保无误后再进行开发,这种沟通成本是很小的,几分钟就能解决的事情。

    在公司中每个职位都有各自的工作要做,所以不要在收到需求后就直接去找产品,你要先对需求有一定的了解再去找产品对接。唯有如此,你才能保证工作质量。

    当你开发东西时卡住了怎么办?

    此时,一定要找你的组长或者主管帮忙,一定要把整个需求和你卡住的问题都描述清楚,只要这样可以节约大家的时间。

    别自己瞎搞,延误了工期。也许你问了别人几十分钟就能解决问题,自己弄就需要很久。千万不要有,问过别人就会显的自己菜的心态,既然你能得到offer,那么你的能力就可以胜任这份工作的,否则,你在面试那一轮你就结束了。

    五、如何在一个新的公司中不断得到提升

    技术群里可以看到很多小伙伴离职原因都是在原公司得不到提升,一部分小伙伴是真到了天花板,另一部分小伙伴此处省略…,自己体会哈!!!

    一周无论给你分配多少需求都不要抱怨,分配得越多你就越了解项目,不要只看自己的一亩三分地。只要保持这种心态,你就不会在任何一家公司得不到提升。

    一个项目少说三五人,多则三五十人开发,行业里经常流传一句话在小公司你的技术提升会非常快,因为什么东西都得你来弄,不会也得快速去学,学了就可以直接运用到项目中,这样技术就提升的非常快。但是你在开发人员稍微多一点的团队,你只做你的肯定不会感觉到明显的提升。

    给你需求分派下来后,你要把这个需求所关联的业务都要仔细看,然后想想如果是你开发的话会怎么写。如果开发思想有出入的话,可以想想别人为什么会这么写,肯定有别人的道理,然后对别人写的东西进行细嚼慢咽,直到任督二脉都被打通。

    一段时间后,你就会发现你对整个项目都会非常的熟悉。在线上遇到bug后能够很快的定位到问题。

    上述仅是个人观点,根据情况来定哈!

    如果你把公司项目熟悉得差不多,就需要开始自我提升了,你的技能水平是怎么样的会很快的在工作中展现出来,一定要经常给自己充电,多看、多练、多想。

    坚持学习、坚持写作、坚持分享是咔咔从业以来所秉持的信念。但愿文章在偌大的互联网上能给你带来一点帮助,我是咔咔,下期见。

    展开全文
  • 我重点解答第一类人,也是大多数人的疑惑:首先我们知道自己这个东西是想有一技之长、好在未来能够安身立命或者是有选择工作的自由,那么我们就往深了想想,我们的这个一技之长到底可以用在什么领域?我想一方面...

    经常会有一些刚接触STM32的人问这个问题,也在其他论坛回答过,现在整理到公众号:

    有需要资料的可以加我:腾讯QQ3249838614

    我个人认为,在回答这个问题之前,你得先问清楚自己,我学习stm32、或者再往更深的地方走,我学习单片机,究竟是为了什么?你现在是处于什么状态?你是学生还是已经参加工作了?你的专业或者你的工作是与单片机相关的还是不相关的?你未来是否想从事这个行业或者想跳槽到这个行业?

    这些所有的问题的答案都可以把学习单片机的人分为两大类:第一类:学习单片机是为了把这个技术当做一技之长安身立命;第二类:仅仅只是玩玩。

    那么我想说的是,第二类人想怎么玩都行,其实并不需要有上面的各种疑惑,不管怎么玩,只要你开心就好。我重点解答第一类人,也是大多数人的疑惑:首先我们知道自己学这个东西是想有一技之长、好在未来能够安身立命或者是有选择工作的自由,那么我们就往深了想想,我们的这个一技之长到底可以用在什么领域?我想一方面就是消费品的开发,比如使用单片机做一些小玩意、这些小玩意虽然成本不会很高,但是销售量很大、这样的话,只要开发完,就可以持续从中获得收益。另一方面就是一些高精尖的东西,比如涉及军工以及工业控制的产品,这样的产品往往量不会特别大,但是利润却不小。

    如果做低端消费品,要求你在有了一个不错的创意之后,第一是能够快速完成开发,因为如果你慢了,市场就是别人的了。第二是能够尽可能降低成本,举一个简单的例子,2016年市场上小风扇特别火,20还包邮,看似没啥利润,但是整个市场每个月有上千万的销量,那么假如你为整个市场供货百分之一,也就是一个月有十万的出货量,这时候你想想,别人用一个一毛钱的单片机做这个小风扇的控制,而你还在用几块钱的单片机做,你一个月要比别人少赚多少?那可是几十万啊,不过话说回来,你仅仅单片机的成本就这么高了,你的产品压根一个都出不去,所以不用担心比别人少赚几十万,因为你一毛都赚不到。。。

    说这个是什么目的?学习和未来做产品做项目不一样,而学习的目的又是为了以后做产品做项目,那么是不是不应该盲目的学!先去看看市场需要什么样的人,需要技术人员具备什么样的技能,然后再去补充自己,让自己成为这样的人。
    所以接下来话题回到学习库还是学习寄存器,以stm32为例子来说,库是ST官方提供的,他们提供这个的目的就是为了降低用户开发产品的周期,这样用户才能在有了创业之后快速开发出自己的产品并占领市场。当然,不是说寄存器开发不快,对于熟手来说寄存器开发也很快,但是毕竟寄存器开发你要对芯片本身的寄存器特别了解,总不能每用一个寄存器就去找手册吧。所以说明确自己的目的,是为了做东西出来,解决市场的痛点,而解决这个问题的方式有两种,那我自然选择怎么快怎么来呗。比如我要做一个汽车,那我总不能自己造轮子,对我而言最快的可能是自己设计好这个汽车的整体指标、性能、然后去找各个汽车零部件供货商制定自己需要的零配件,然后把他们组装起来就可以了。

    另一方面,现在各个芯片厂商都提供了自己的库,所以说我今天学会了stm32的库开发,明天给我一个HT32芯片或者一个nrf51822芯片或者个GD32芯片,我都可以去借助他们的库快速一天内就可以上手开发,甚至不同的芯片接触的多了,当接触到一个新的芯片之后,你压根不需要做什么学习,直接上手就能用库开始写自己的产品的功能代码了。市面上芯片很多,不同厂商的芯片价格都不一样。我想如果只做一个无线开关的终端的话,你肯定不会用一个48脚、flash容量比较大的、品牌厂商提供的芯片吧,这太贵了,你很可能会去找成本几毛钱的那种少引脚OTP单片机去实现这个功能的。

    所以说到这里,我的观点很明确:想通过学会单片机来让自己有一技之长的人,就不要认为自己一定要学会所谓的寄存器了。但是也不是去学习一个具体的库,而是通过这个库的学习,搞明白芯片原厂提供的支持都有什么、这些支持我们怎么快速使用。进而在学会使用一家厂商提供的支持之后,获得能够快速从其他厂商处获取支持的能力。

    而且你学库的过程中,你就会发现,库里面就是对寄存器的操作,只不过是厂家把这一系列的寄存器操作给你封装好了。芯片原厂,芯片设计厂商现在都在极尽所能的让开发变得简单,所以他们都做了很多工作,比如ARM搞的mbed平台,还有st搞的兼容Arduino平台,TI自己搞的energia平台,这些都是为了帮助用户降低开发周期,快速做出自己的产品而投入巨大精力做出来的东西。拿energia平台来说,我之前没用过TI的芯片,但是现在我可以话五分钟使用TI的430F5529来实现串口通讯、AD采集等功能。拿ST的cubemx来说,我可以几分钟完成管脚分配和代码自动生成。在keil5中可以一分钟完成ucosiii、freertos、rtt等操作系统的移植,如果想使用json格式进行通讯、只需要直接调用写好的函数就行。所有所有的工作,都是为了方便大家简单快速开发。因为厂商知道,用户用他们的芯片十位了解决问题,重点是为了解决问题而不是使用芯片。至于厂商之间的竞争力和动力,这不是我们在这个问题里需要回答的内容。另外大家要知道,半导体厂商、芯片厂商、开发环境供应商所完成的底层工作,永远比你自己写的驱动更稳定可靠。

    当然,并不是说所有人都没必要学习寄存器,只是说现在这个社会分工越来越明确,行业越来越细化的时代,如果你想从事消费电子的开发,那就要掌握快速开发的法门,尽量不要接触底层,因为只有个别中断或者其他对实时性要求高的地方才会用到寄存器、甚至汇编。而如果说你是做工业控制或者武器控制、对控制的实时性要求极高,那你就去学习寄存器。其实话又说回来,在这种场合,一个成熟的架构师又怎么会选择使用单片机来控制呢?很明显如果实时性要求高,就会选择FPGA,如果对于运算的要求高,那就选择DSP。另外一部分需要精通底层的是做这些库、做驱动、做底层支持包的人,如果你想成为这一部分人,那么,只学寄存器远远不够,你还要学习汇编、学习内核原理等很多很多知识。

    我做的是小四轴,小四轴在小玩物里算是对实时性要求比较高了,但我用库开发也没任何问题,而且速度很快,也容易读懂、容易理解、容易移植。并没有因为不是用寄存器操作而性能不好。

    所以归根结底,要知道自己学这个东西是为了什么?针对不同的目的有不同的学习方案。搞懂自己的学习目的,也就搞懂了自己应该学啥。

    嵌入式就业交流群 551627734一起交流 学习 欢迎全国各地的大学生和各位行业大佬一起交流!

    在这里插入图片描述
    新手上手STM32是学习库开发还是寄存器开发?
    STM32单片机硬件关键基础精华及注意事项
    http://www.makeru.com.cn/live/1758_318.html?s=69821

    走进ARM-ARM开发环境搭建

    http://www.makeru.com.cn/live/1758_318.html?s=69821

    ARM之蜂鸣器播放音乐

    http://www.makeru.com.cn/live/1758_328.html?s=69821

    ARM之中断GIC分析

    http://www.makeru.com.cn/live/1758_718.html?s=69821

    ARM体系结构A53新特性

    http://www.makeru.com.cn/live/1758_814.html?s=69821

    ARM-RTC时钟的运用

    http://www.makeru.com.cn/live/3337_1088.html?s=69821

    第一场:Arm引领智能物联新时代

    http://www.makeru.com.cn/live/3337_1087.html?s=69821

    最新ARM微控制器在物联网系统中的应用案例

    展开全文
  • 我的Go+语言初体验——Python开发者轻松上手

    千次阅读 多人点赞 2021-11-23 18:37:13
    这应该是全CSDN最好的Go+语言初体验征文了 我的Go+语言初体验——Python开发者轻松上手
  • Flask入门和快速上手

    千次阅读 2018-09-06 11:34:50
    Flask入门和快速上手 Flask入门和快速上手 python三大主流框架对比 Flask安装 依赖 可选依赖 创建flask项目 flask最小应用–hello word 非法导入名称 调试模式 路由 唯一的 URL / 重定向行为 URL 构建 HTTP ...
  • 由于虚拟内存与物理内存的映射关系需要查询页表,页表的查询是很的过程,因此会把常用的地址映射关系缓存在 TLB 里的,这样便可以提高页表的查询速度,如果发生了进程切换,那 TLB 缓存的地址映射关系就会失效,...
  • 学校里不到的东西(二)

    千次阅读 2012-06-09 18:07:25
    有一次,我在看李开复老师的演讲视频《给未来的你》,里面他说的几句话...在经过这几周的工作之后,我总算是明白他的良苦用心了,他是要告诉我们:很多东西在学校是不到的!  根据我自身在单位上的经历,我觉得
  • Rust_2_上手笔记

    千次阅读 2018-04-03 10:28:14
    2018/03/08看完Rust的官方文档翻译:https://kaisery.github.io/trpl-zh-cn/ch01-01-installation.html1,有时下载了github的代码编译时,两个问题: a,下载依赖的库很, b,有些库在stable版本下不能编译,一...
  • 人都是有欲望的,当然如果你的欲望就是学习,那你就奖励自己再五百年吧~哈哈(注意:这里的奖励不要是让人上瘾的东西,你奖励自己打游戏、刷肥皂剧,那不在骗自己吗?) 比如马上速度与激情:特别行动就要上映了,...
  • 零基础Docker【1】 | 一文带你快速了解并上手Docker

    千次阅读 多人点赞 2020-11-07 23:51:29
    之前在服务器配置一个应用的运行环境,要安装各种软件,就拿某谷的电商项目为例,Java/Tomcat/Mysql/JDBC驱动包等,安装和配置这些东西有多麻烦就不必多说了。它还不能跨平台。假设我们是在Windows上安装的这些环境...
  • 学习经济用啥软件

    2020-12-06 13:07:59
    缺点:(1)Eviews很多东西都是封闭的,一般情况下你不知道它背后的机理,使用什么样的估计方法、判别准则等等。Eviews这一特点,外加很多人用Eviews都是使用默认设定,你有时可能意识不到自己的操作存在错误。(2)...
  • 看英文的速度还是比看中文一些,我们要的是最短的时间,而不是追求短时间内记住所有细节。当然,如果是一篇论文,建议看英文原版还是有好处的。 STM32处理器进入国内市场时候,ST官方(或者第三方)的推广工作做...
  • 学会做笔记,把自己到的东西及时记下来,形成目录,在后面用到的时候,根据笔记再去看一遍,刚开始经常会出现,听得懂,跟着学会,自己弄就不会的现象。这都是正常的,技术本就是个熟能生巧的过程。 多动手,多...
  • Java学习路线图(如何快速Java)

    万次阅读 多人点赞 2018-11-21 15:12:30
    不知不觉从初学Java到现在已经8...如何快速Java 这里我以Java EE(Jakarta EE)/Java Web的经验来说哦。(都把你们看做是零基础入门的了) 学习Java EE(Jakarta EE)总体来说会有以下三大模块: Java 数据库 We...
  • Java线上问题排查神器Arthas快速上手与原理浅谈

    千次阅读 多人点赞 2019-11-17 11:53:49
    前言 当你兴冲冲地开始运行自己的Java项目时,你是否遇到过如下问题: 程序在稳定运行了,可是实现的功能点了...程序功能正常了,可是为啥响应时间这么,在哪里出现了问题? 程序不但稳定运行,而且功能完美,但...
  • 大学计算机系最努力的同学都是如何学习的?

    千次阅读 多人点赞 2021-06-23 17:47:54
    总体来说的并不是很深入,因为设计模式这个东西学起来很简单,但是实际项目中应用起来太难了,而且根据我面试中的经验,一般蛮少有面试官会问,就算问也就问一问简单的单例模式、工厂模式这些,问的不是很深入。...
  • Vue 快速上手教程

    万次阅读 2020-06-04 23:21:32
    这样子的话,下载会快很多~ #-g就是全局安装 #npm更换淘宝镜像 npm config set registry https://registry.npm.taobao.org npm install -g cnpm --registry=https://registry.npm.taobao.org 安装过程可能有点~,...
  • 学习大数据为什么先java?

    千次阅读 2019-08-27 21:59:34
    大数据的就业、工资的水平等等方面都让更多的人投身进入到学习大数据的旗下。在我之前写文章的时候,其实总是有这样的粉丝问我,你的这文章和大数据有...今天我带大家来分析一波,学习大数据为什么先java。 ...
  • 如果当clip十分复杂而且电脑配置很渣,运行很的时候,预览一般会出现比真实画面速度的情况,这个时候,我没可以尝试降低帧率,或者使用 clip.resize 减小clip的尺寸。 ipython_display 如果不使用 clip....
  • 树莓派无屏上手指南

    2020-08-29 11:14:39
    第一次登录可能会有点,稍微等待即可。 连接上之后,我们就可以愉快的玩耍树莓派了。 配置树莓派 1. 配置 raspi-config 对于带屏幕的树莓派,首次启动时,会自动出现 raspi-config 配置界面。而对于 SSH 远程连接...
  • Shell、Python都可以,有个东西叫Hadoop Streaming。   第二章:更高效的WordCount 2.1 点SQL吧 你知道数据库吗?你会写SQL吗? 如果不会,请点SQL吧。 2.2 SQL版WordCount 在1.6中,你写...
  • 刚开始接触爬虫的时候,简直惊为天人,十几行代码,就可以将无数网页的信息全部获取下来,自动选取网页元素,自动整理成结构化的文件。...从哪里开始,哪些是最开始应该的,哪些应该等到有一定基础之后再
  • 五分钟Java:一篇文章带你搞懂spring全家桶套餐

    千次阅读 多人点赞 2020-03-26 22:31:11
    我最早写博客的时候,就是在上手做一个简单的ssm项目,当时笨手笨脚地配置好了各种东西,好不容易把整个工程跑了起来,于是高兴地记录起了实战过程,后来时间一久,再回去看当初的那几篇博客,觉得自己真是菜的抠脚...
  • 需要学习的知识越来越多,感觉什么都要,但是又懒得动手敲代码,不敲代码又无法深入理解,很多东西看了就忘光了。仿佛进入了一死循环的怪圈,对学习的兴趣越来越低,每天都好像在混日子,毫无成就感。 有人说,每...
  • 为何学习大数据,要先Java

    千次阅读 2018-09-08 11:26:31
    大数据的就业、工资的水平等等方面都让更多的人投身进入到学习大数据的旗下。在我之前写文章的时候,其实总是有这样的粉丝问我,你的这文章和大数据有...今天我带大家来分析一波,学习大数据为什么先java。 ...
  • 【进大厂必】3W字180张图学习Linux基础总结

    千次阅读 多人点赞 2021-05-22 10:39:50
    为什么说了解Linux 的生态,会让你到更多的新技术? 我们要知道很多的大牛通过Linux来开发各种如那件,数据库 Mysql,kafka,Spark 等技术都会默认提供 Linux 的安装运维手册,所以尽快的进入 Linux 的世界对于...
  • 一小时的时间,上手 Webpack

    千次阅读 2020-04-13 08:53:37
    本文由公众号 字节逆旅 的主笔 一拍 写作而成,一拍 已认证成为图雀社区专栏作者,后续将为大家带来一系列 Webpack 的文章,敬请期待✌️。欢迎加入图雀社区,一起创作精彩的免费技术实战教程,加速技术的传播!...
  • 学习 Python 数据分析的正确姿势

    千次阅读 2020-12-07 15:26:39
    这对于只需要提取、清洗数据、绘制可视化图、构建模型的数据分析师来说实在是误人子弟,数据分析师要的不是开发应用软件,而是应该把时间和精力花在学习处理数据的模块与支持库上。请根据以下步骤一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,269
精华内容 5,707
关键字:

学东西上手慢