初步认识 LESS,我要开始学习LESS啦!

LESS 是一个流行的样式表语言,它提供了 CSS3 也未曾实现的多种功能,让您编写 CSS 更加方便,更加直观。LESS 已经被广泛使用在多种框架中 ( 例如:BootStrap)。本文将介绍 LESS 产生的背景、优势、演化与 CSS 之间的转化,及其典型的应用场景,并将其与其他样式表语言进行比较。相信前端开发工程师会喜欢 LESS,灵活运用 LESS 以提高开发效率。

LESS 背景介绍

LESS 提供了多种方式能平滑的将写好的代码转化成标准 CSS 代码,在很多流行的框架和工具盒中已经能经常看到 LESS 的身影了(例如 Twitter 提供的 bootstrap 库就使用了 LESS)。那么,LESS 是从何而来呢?它和 SASS 等样式表语言又有何区别呢?

图 1.LESS 的官网介绍

根 据维基百科上的介绍,其实 LESS 是 Alexis Sellier 受 SASS 的影响创建的开源项目。当时 SASS 采用了缩进作为分隔符来区分代码块,而不是 CSS 中广为使用的括号。为了让 CSS 现有用户使用起来更为方便,Alexis 开发了 LESS 并提供了类似的功能。在一开始,LESS 的解释器也同样是由 Ruby 编写,后来才转而采用了 JavaScript. LESS 代码既可以运行在客户端,也可以运行在服务器端。在客户端只要把 LESS 代码和相应的 JavaScript 解释器在同一页面引用即可;而在服务器端,LESS 可以运行在 Node.js 上,也可以运行在 Rhino 这样的 JavaScript 引擎上。

说一点题外话,其实现在的 SASS 已经有了两套语法规则:一个依旧是用缩进作为分隔符来区分代码块的;另一套规则和 CSS 一样采用了大括弧作为风格符。后一种语法规则又名 SCSS,在 SASS 3 之后的版本都支持这种语法规则。SCSS 和 LESS 已经越来越像了,它俩之间更详细的对比可以参考 此链接

LESS 高级特性

我 们知道 LESS 拥有四大特性:变量、混入、嵌套、函数。这些特性在其他文章中已经有所介绍,这里就不复述了。其实,LESS 还拥有一些很有趣的特性有助于我们的开发,例如模式匹配、条件表达式、命名空间和作用域,以及 JavaScript 赋值等等。让我们来逐一看看这些特性吧。

模式匹配:

相信大家对 LESS 四大特性中的混入 (mixin) 依然印象深刻吧,您用它能够定义一堆属性,然后轻松的在多个样式集中重用。甚至在定义混入时加入参数使得这些属性根据调用的参数不同而生成不同的属性。那 么,让我们更进一步,来了解一下 LESS 对混入的更高级支持:模式匹配和条件表达式。

首先,让我们来回顾一下普通的带参数的混入方式:

清单 1. 带参数(及参数缺省值)的混入

Html代码  

  1. .border-radius (@radius: 3px) {
  2. border-radius: @radius;
  3. -moz-border-radius: @radius;
  4. -webkit-border-radius: @radius;
  5. }
  6. .button {
  7. .border-radius(6px);
  8. }
  9. .button2 {
  10. .border-radius();
  11. }
清单 2. 混入生成的 CSS 代码

Html代码  

  1. .button {
  2. border-radius: 6px;
  3. -moz-border-radius: 6px;
  4. -webkit-border-radius: 6px;
  5. }
  6. .button2 {
  7. border-radius: 3px;
  8. -moz-border-radius: 3px;
  9. -webkit-border-radius: 3px;
  10. }

从上面这个例子可以看出,在混入我们可以定义参数,同时也可以为这个参数指定一个缺省值。这样我们在调用这个混入时如果指定了参数 .border-radius(6px),LESS 就会用 6px来替换,如果不指定参数来调用.border-radius(),LESS 就会用缺省的 3px来替换。现在,我们更近一步,不仅仅通过参数值来更改最终结果,而是通过传入不同的参数个数来匹配不同的混入。

清单 3. 利用不同的参数个数来匹配不同的混入

Html代码  

  1. .mixin (@a) {
  2. color: @a;
  3. width: 10px;
  4. }
  5. .mixin (@a, @b) {
  6. color: fade(@a, @b);
  7. }
  8. .header{
  9. .mixin(red);
  10. }
  11. .footer{
  12. .mixin(blue, 50%);
  13. }
清单 4. 不同参数个数调用后生成的 CSS 代码

Html代码  

  1. .header {
  2. color: #ff0000;
  3. width: 10px;
  4. }
  5. .footer {
  6. color: rgba(0, 0, 255, 0.5);
  7. }

这个例子有些像 Java 语言中的方法调用有些类似,LESS 可以根据调用参数的个数来选择正确的混入来带入。现在,我们了解到通过传入参数的值,以及传入不同的参数个数能够选择不同的混入及改变它的最终代码。这两 个例子的模式匹配都是非常容易理解的,让我们换个思路,上面的例子中参数都是由变量构成的,其实在 LESS 中定义参数是可以用常量的!模式匹配时匹配的方式也会发生相应的变化,让我们看个实例。

清单 5. 用常量参数来控制混入的模式匹配

Html代码  

  1. .mixin (dark, @color) {
  2. color: darken(@color, 10%);
  3. }
  4. .mixin (light, @color) {
  5. color: lighten(@color, 10%);
  6. }
  7. .mixin (@zzz, @color) {
  8. display: block;
  9. weight: @zzz;
  10. }
  11. .header{
  12. .mixin(dark, red);
  13. }
  14. .footer{
  15. .mixin(light, blue);
  16. }
  17. .body{
  18. .mixin(none, blue);
  19. }
清单 6. 常量参数生成的 CSS 代码

Html代码  

  1. .header {
  2. color: #cc0000;
  3. display: block;
  4. weight: dark;
  5. }
  6. .footer {
  7. color: #3333ff;
  8. display: block;
  9. weight: light;
  10. }
  11. .body {
  12. display: block;
  13. weight: none;
  14. }

通过这个例子我们可以看出,当我们定义的是变量参数时,因为 LESS 中对变量并没有类型的概念,所以它只会根据参数的个数来选择相应的混入来替换。而定义常量参数就不同了,这时候不仅参数的个数要对应的上,而且常量参数的 值和调用时的值也要一样才会匹配的上。值得注意的是我们在 body 中的调用,它调用时指定的第一个参数 none 并不能匹配上前两个混入,而第三个混入 .mixin (@zzz, @color)就不同了,由于它的两个参数都是变量,所以它接受任何值,因此它对三个调用都能匹配成功,因此我们在最终的 CSS 代码中看到每次调用的结果中都包含了第三个混入的属性。

最后,我们把清单 1 中的代码做略微改动,增加一个无参的混入和一个常量参数的混入,您猜猜看最终的匹配结果会发生什么变化么?

清单 7. 无参和常量参数的模式匹配

Html代码  

  1. .border-radius (@radius: 3px) {
  2. border-radius: @radius;
  3. -moz-border-radius: @radius;
  4. -webkit-border-radius: @radius;
  5. }
  6. .border-radius (7px) {
  7. border-radius: 7px;
  8. -moz-border-radius: 7px;
  9. }
  10. .border-radius () {
  11. border-radius: 4px;
  12. -moz-border-radius: 4px;
  13. -webkit-border-radius: 4px;
  14. }
  15. .button {
  16. .border-radius(6px);
  17. }
  18. .button2 {
  19. .border-radius(7px);
  20. }
  21. .button3{
  22. .border-radius();
  23. }

下面的结果可能会出乎您的意料,无参的混入是能够匹配任何调用,而常量参数非常严格,必须保证参数的值(7px)和调用的值 (7px)一致才会匹配。

清单 8. 加入了无参混入后生成的 CSS 代码

Html代码  

  1. .button {
  2. border-radius: 6px;
  3. -moz-border-radius: 6px;
  4. -webkit-border-radius: 6px;
  5. border-radius: 4px;
  6. -moz-border-radius: 4px;
  7. -webkit-border-radius: 4px;
  8. }
  9. .button2 {
  10. border-radius: 7px;
  11. -moz-border-radius: 7px;
  12. -webkit-border-radius: 7px;
  13. border-radius: 7px;
  14. -moz-border-radius: 7px;
  15. border-radius: 4px;
  16. -moz-border-radius: 4px;
  17. -webkit-border-radius: 4px;
  18. }
  19. .button3 {
  20. border-radius: 3px;
  21. -moz-border-radius: 3px;
  22. -webkit-border-radius: 3px;
  23. border-radius: 4px;
  24. -moz-border-radius: 4px;
  25. -webkit-border-radius: 4px;
  26. }

条件表达式

有了模式匹配之后是方便了很多,我们能根据不同的需求来匹配不同的混入,但更进一步的就是利用条件表达式来更加准确,更加严格的来限制混入的匹配,实现的方式就是利用了 when这个关键词。

清单 9. 利用条件表达式来控制模式匹配

Html代码  

  1. .mixin (@a) when (@a >= 10) {
  2. black;
  3. }
  4. .mixin (@a) when (@a < 10) {
  5. white;
  6. }
  7. .class1 { .mixin(12) }
  8. .class2 { .mixin(6) }
清单 10. 条件表达式生成的 CSS 代码

Html代码  

  1. .class1 {
  2. black;
  3. }
  4. .class2 {
  5. white;
  6. }

利用 When 以及 <, >, =, <=, >= 是十分简单和方便的。LESS 并没有停留在这里,而且提供了很多类型检查函数来辅助条件表达式,例如 iscolorisnumberisstringiskeywordisurl等等。

清单 11. 条件表达式中支持的类型检查函数

Html代码  

  1. .mixin (@a) when (iscolor(@a)) {
  2. black;
  3. }
  4. .mixin (@a) when (isnumber(@a)) {
  5. white;
  6. }
  7. .class1 { .mixin(red) }
  8. .class2 { .mixin(6) }
清单 12. 类型检查匹配后生成的 CSS 代码

Html代码  

  1. .class1 {
  2. black;
  3. }
  4. .class2 {
  5. white;
  6. }

另外,LESS 的条件表达式同样支持 AND 和 OR 以及 NOT 来组合条件表达式,这样可以组织成更为强大的条件表达式。需要特别指出的一点是,OR 在 LESS 中并不是用 or 关键字,而是用 , 来表示 or 的逻辑关系。

清单 13. AND,OR,NOT 条件表达式

Html代码  

  1. .smaller (@a, @b) when (@a > @b) {
  2. black;
  3. }
  4. .math (@a) when (@a > 10) and (@a < 20) {
  5. red;
  6. }
  7. .math (@a) when (@a < 10),(@a > 20) {
  8. blue;
  9. }
  10. .math (@a) when not (@a = 10)  {
  11. yellow;
  12. }
  13. .math (@a) when (@a = 10)  {
  14. green;
  15. }
  16. .testSmall {.smaller(30, 10) }
  17. .testMath1 {.math(15)}
  18. .testMath2 {.math(7)}
  19. .testMath3 {.math(10)}
清单 14. AND,OR,NOT 条件表达式生成的 CSS 代码

Html代码  

  1. .testSmall {
  2. black;
  3. }
  4. .testMath1 {
  5. red;
  6. yellow;
  7. }
  8. .testMath2 {
  9. blue;
  10. yellow;
  11. }
  12. .testMath3 {
  13. green;
  14. }

命名空间和作用域

LESS 所带来的变量,混入这些特性其实很大程度上避免了传统 CSS 中的大量代码重复。变量能够避免一个属性多次重复,混入能够避免属性集的重复。而且使用起来更加灵活,维护起来也方便了许多,只要修改一处定义而无需修改 多处引用的地方。现在,让我们更进一步,当我定义好了变量和混入之后,怎么能更好的控制和运用它们呢,怎么避免和其他地方定义的变量及混入冲突?一个显而 易见的想法就是像其他语言一样引入命名空间和作用域了。首先我们来看一个 LESS 的作用域的例子。

清单 15. 变量的作用域

Html代码  

  1. @var: red;
  2. #page {
  3. @var: white;
  4. #header {
  5. color: @var;
  6. }
  7. }
  8. #footer {
  9. color: @var;
  10. }

在这个例子里,可以看到 header 中的 @var会首先在当前作用域寻找,然后再逐层往父作用域中寻找,一直到顶层的全局作用域中为止。所以 header 的 @var在父作用域中找到之后就停止了寻找,最终的值为 white。而 footer 中的 @var在当前作用域没找到定义之后就寻找到了全局作用域,最终的结果就是全局作用域中的定义值 red。

清单 16. 变量作用域例子生成的 CSS 代码

Html代码  

  1. #page #header {
  2. color: #ffffff;  // white
  3. }
  4. #footer {
  5. color: #ff0000;  // red
  6. }

了解了作用域之后让我们再来看一下命名空间,我们可以用命名空间把变量和混入封装起来,避免和其他地方的定义冲突,引用起来也十分方便,只要在前面加上相应的命名空间就可以了。

清单 17. 命名空间的例子

Html代码  

  1. @var-color: white;
  2. #bundle {
  3. @var-color: black;
  4. .button () {
  5. display: block;
  6. border: 1px solid black;
  7. @var-color;
  8. }
  9. .tab() { color: red }
  10. .citation() { color: black}
  11. .oops {weight: 10px}
  12. }
  13. #header {
  14. color: @var-color;
  15. #bundle > .button;
  16. #bundle > .oops;
  17. }

这里可以看出,我们利用嵌套规则在 #bundle中建立了一个命名空间,在里面封装的变量以及属性集合都不会暴露到外部空间中,例如 .tab(), .citation()都没有暴露在最终的 CSS 代码中。而值得注意的一点是 .oops 却被暴露在了最终的 CSS 代码中,这种结果可能并不是我们想要的。其实同样的例子我们可以在混入的例子中也可以发现,即无参的混入 .tab()是和普通的属性集 .oops不同的。无参的混入是不会暴露在最终的 CSS 代码中,而普通的属性集则会现在出来。我们在定义命名空间和混入时要小心处理这样的差别,避免带来潜在的问题。

清单 18. 命名空间例子生成的 CSS 代码

Html代码  

  1. #bundle .oops {
  2. weight: 10px;
  3. }
  4. #header {
  5. color: #ffffff;
  6. display: block;
  7. border: 1px solid black;
  8. #000000;
  9. weight: 10px;
  10. }

JavaScript 赋值 (JavaScript Evaluation)

如 果能在 CSS 中使用一些 JavaScript 方法无疑是十分令人兴奋的,而 LESS 真正逐步加入这项功能,目前已经能使用字符串及数字的常用函数了,想要在 LESS 中运用 JavaScript 赋值只需要用反引号(`)来包含所要进行的操作即可。让我们看看实例吧。

清单 19. JavaScript 赋值的例子

Html代码  

  1. .eval {
  2. js: `1 + 1`;
  3. js: `(1 + 1 == 2 ? true : false)`;
  4. js: `"hello".toUpperCase() + ‘!‘`;
  5. title: `process.title`;
  6. }
  7. .scope {
  8. @foo: 42;
  9. var: `this.foo.toJS()`;
  10. }
  11. .escape-interpol {
  12. @world: "world";
  13. width: ~`"hello" + " " + @{world}`;
  14. }
  15. .arrays {
  16. @ary:  1, 2, 3;
  17. @ary2: 1  2  3;
  18. ary: `@{ary}.join(‘, ‘)`;
  19. ary: `@{ary2}.join(‘, ‘)`;
  20. }

我们可以看到,在 eval 中我们可以用 JavaScript 做数字运算,布尔表达式;对字符串做大小写转化,串联字符串等操作。甚至最后能够获取到 JavaScript 的运行环境(process.title)。同样可以看到 LESS 的作用域和变量也同样在 JavaScript 赋值中使用。而最后的例子中,我们看到 JavaScript 赋值同样运用于数组操作当中。其实 LESS 的 JavaScript 赋值还有支持其他一些方式,不过目前尚未公布出来。

清单 20. JavaScript 赋值生成的 CSS 代码

Html代码  

  1. .eval {
  2. js: 2;
  3. js: true;
  4. js: "HELLO!";
  5. title: "/Users/Admin/Downloads/LESS/Less.app/Contents/Resources/engines/bin/node";
  6. }
  7. .scope {
  8. var: 42;
  9. }
  10. .escape-interpol {
  11. width: hello world;
  12. }
  13. .arrays {
  14. ary: "1, 2, 3";
  15. ary: "1, 2, 3";
  16. }

LESS 开发的实用工具 – LESS.app

在 LESS 开发中,我们可以用 LESS 提供的 JavaScript 脚本来在运行时解析,将 LESS 文件实时翻译成对应的 CSS 语法。如下面这个例子:

清单 21. helloworld.html

Html代码  

  1. <link rel="stylesheet/less" type="text/css" href="helloworld.less">
  2. <script src="less.js" type="text/javascript"></script>
  3. <div class="helloworld">Hello World!</div>

从上 面的示例可以看出,在 helloworld.less 引入之后我们还添加了一个 JavaScript 文件,这个文件就是 LESS 的解释器,可以在 LESS 的官方网站上下载此文件。需要注意的是,要注意 LESS 文件和 LESS 解释器的引入顺序,确保所有的 LESS 文件都在 LESS 解释器之前。

看到这里也许有人会说,实时解析的话方便倒是方便,可以性能上不就有损耗了么?比起普通 CSS 来说多了一道解释的手续。也许还有的人对写好的 LESS 文件不太放心,希望能看到解析之后的 CSS 文件来检查下是否是自己希望的内容。这两个问题其实都是能够解决的,LESS 提供了服务端的方案,使用 npm 安装 LESS 之后就能够将您所有的 LESS 文件批量转化成 CSS 文件,然后您拿到 CSS 文件就可以随心所欲了,检查生成的内容是否有误,也可以直接在 HTML 中引用,再也不用添加 LESS 的 JavaScript 文件来解析它了。关于这部分的详细安装信息,可以直接参考 LESS 官网上的介绍,这里就不复述了。

不过,对于 Mac 用户来说还有一个更方便的工具可以使用,它就是 less.app. 这是一个第三方提供的工具,使用起来十分方便,我们可以在下图所示的界面上添加 LESS 文件所在的目录,此工具就会在右侧列出目录中包含的所有 LESS 文件。最酷的是,从此您就不用再操心惦记着要把 LESS 文件编译成 CSS 文件了,这个工具会在您每次修改完保存 LESS 文件时自己执行编译,自动生成 CSS 文件。这样,您就可以随时查看 LESS 代码的最终效果,检查目标 CSS 是否符合您的需要了,实在是太方便了!

图 2. 导入 LESS 文件夹的界面,左侧可添加存放在多个不同路径的文件夹。

图 3. 编译结果界面,在此可手动批量编译所有 LESS 文件。

更值为称道的是,LESS.app 还是个免费软件,接受捐赠:)

总结

通过上面的简单介绍,希望大家了解到了 LESS 的主要功能,相信 LESS 会让前端攻城师的工作更为轻松,更加灵活。更多的细节可以参考 LESS 官方网站。

参考资料

学习

  • LESS CSS 框架简介”(developerWorks,2012 年 7 月):LESS 是动态的样式表语言,通过简洁明了的语法定义,使编写 CSS 的工作变得非常简单。本文将通过实例,为大家介绍这一框架。
  • LESS 官方网站: 包括官方参考文档库,示例代码等相关资料。
  • 维基百科上的 LESS 条目包括了 LESS 的历史,功能介绍,与其他样式语言的对比等资料。
  • LESS.app 官方网站LESS.app 的官方网站,提供了 LESS.app 的下载,视频介绍,相关问题回答等资料。
  • twitter提供的 bootstrap由 Twitter 共享出的 CSS 工具包,使开发者能够轻松的创建出漂亮的界面。其中很多地方都使用了 LESS。
  • SASS官方网站包含了 SASS 和 SCSS 的下载,帮助文档,以及在线教程等资料。
  • developerWorks Web development 专区:通过专门关于 Web 技术的文章和教程,扩展您在网站开发方面的技能。
  • developerWorks Ajax 资源中心:这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。
  • developerWorks Web 2.0 资源中心,这是有关 Web 2.0 相关信息的一站式中心,包括大量 Web 2.0 技术文章、教程、下载和相关技术资源。您还可以通过 Web 2.0 新手入门栏目,迅速了解 Web 2.0 的相关概念。
  • 查看 HTML5 专题,了解更多和 HTML5 相关的知识和动向。

讨论

  • 加入 developerWorks 中文社区。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。
时间: 2024-11-06 16:41:37

初步认识 LESS,我要开始学习LESS啦!的相关文章

Monkey原理初步和改良优化--Android自动化测试学习历程

章节:自动化基础篇——Monkey原理初步和改良优化(第三讲) 主要讲解内容与笔记: 一.理论知识: 直接看文档,来了解monkey的概念.基本原理,以及如何使用. First,what is Android Monkey? The Monkey is a program that runs on your emulator or device and generates pseudo-random streams of user events such as clicks, touches,

20145224-陈颢文 《Java程序设计》第一周学习总结

20145224 <Java程序设计>第一周学习总结 教材学习内容总结 通过第一周的学习让我对Java有了个初步的了解,知道了Java分为Java SE.Java EE.Java ME三大平台,其中Java SE是基础.Java的一大特点是它可以跨平台,而JVM对Java的跨平台提供了支持,它就类似于一个虚拟机,只要在当前平台安装了相应的JVM,Java程序就有了可以在此平台上运行的基础啦.JRE是Java的执行环境,在安装了JRE的计算机上就可以运行Java的程序了,当然光是可以跑代码对于程

20145238-荆玉茗 《Java程序设计》第一周学习总结

20145238 <Java程序设计>第一周学习总结 教材学习内容总结 Java三大平台:由于java领域的应用越来越广,根据不同级别的应用开发区分了不同的应用版本,后正式更名为Java SE,Java EE,Java ME. Java SE主要分为四个部分:JVM,JRE,JDK和JAVA语言. 了解JCP与JSR.RI.TCK的关系:JSR必须经过JCP投票通过才能成为最终的标准文件,JSR成为最终文件后对其成果做出免费且开发原始码的参考实现,称为RI,由TCK作为技术兼容测试工具箱. 了

Android菜鸟如何学习Android系统开发?

如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类专业一般都会开设C语言课程,只是很多同学在大学期间并没有好好学习,如果对它掌握的不太好或者很久没用了,建议先从将其好好复习一下,将其基本的语法再好好回顾一下,最好能搭建一个环境来运行.调试它.如果没有学过,不妨也提前学习一下,可以参考清华大学出版社出版的谭浩强老师的<C语言程序设计>,推荐这本书的

OpenCV&amp;Qt学习之四——OpenCV 实现人脸检测与相关知识整理

开发配置 OpenCV的例程中已经带有了人脸检测的例程,位置在:OpenCV\samples\facedetect.cpp文件,OpenCV的安装与这个例子的测试可以参考我之前的博文Linux 下编译安装OpenCV. 网上能够找到关于OpenCV人脸检测的例子也比较多,大多也都是基于这个例程来更改,只是多数使用的是OpenCV 1.0的版本,而OpenCV2.0以后由于模块结构的更改,很多人并没有将例程运行起来.如果是新版的OpenCV跑旧的例程,编译运行出错的话,需要确保: #include

好程序员告诉你Java架构师学习路线

好程序员告诉你Java架构师学习路线,从初级Java工程师成长为Java架构师,你需要走很长的路,很多有计划的人在学习之初就在做准备.你知道Java架构师学习路线该怎么走吗?成为一个优秀的Java架构师究竟需要学什么?接下来就跟小编一起揭晓答案. 架构师是一个充满挑战的职业,知识面的宽窄往往决定着一个架构师的架构能力.架构师在整个软件开发过程中都起着重要的作用,并随着开发进程的推进而其职责或关注点不断地变化. 想要成为Java架构师,你首先要是一个高级Java工程师,可以熟练使用各种框架,并知道

谈对于程序、软件、软件工程的初步认识

  在我上大学前刚开始听说软件工程这个词的时候,我心里就有了疑问,软件工程到底是做什么的?难道是做软件的?那软件又是什么?于是我那时还去上网搜了搜,解开了自己心里的疑问,我当时所理解的软件工程就是围绕软件开发相关的一个专业. 我们这学期也开了软件工程这门课,刚上课一个星期的我也对程序.软件.软件工程有了初步的了解. 软件:最初定义是汇编和自动地程序设计的其他方面所组成,至少和现代计算机中的电子管.晶体管.磁带等等称为硬件的内容有着同样重要的事务.与硬件相比,软件的逻辑复杂性要高出10~100倍.

android使用友盟实现第三方登录、分享以及微信回调无反应问题解决办法

        Leaning_wk每一次的进步都会拉近与成功的距离! 帐号设置退出   关闭 qq_15855289的博客 目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8月书讯      每周荐书:Java Web.Python极客编程(评论送书) android使用友盟实现第三方登录.分享以及微信回调无反应问题解决办法 标签: android友盟第三方登录分享微信登录回调问题 2017-02-10 16:2

github版本库使用详细教程(命令行及图形界面版)

Git是一个分布式的版本控制系统,作为开源代码库以及版本控制系统,Github目前拥有140多万开发者用户.随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法. Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目前,包括 Rubinius和Merb在内的很多知名项目都使用了Git.Git同样可以被诸如Capistrano和Vl