前端知识补足计划

恶补进行中…… 记录下进度,免得过几天又忘了,跑去看别的,最后一无所获。一步一步走!

某块内容积累的足够多了,就把它单独整理出去,记得这里留下目录链接,单独也留下回主页链接。

接下来的一段时间将主要用来补充一些进阶的前端知识,如npm命令详解,package.json文件结构详解,某个知识点如reset.css和normalize.css区别,require使用,cmd和amd区别,sea.js使用规范等等。

尽量都写到当前这一个文件中,(特殊需求除外)采用标题的的形式,暂时先不关注前后逻辑性,学到哪里写到哪里。抽空温习,毕竟记性不好。。。。。

一、npm命令详解

英文官方文档站点: https://docs.npmjs.com/

npm install <name> 安装(nodejs依赖)包

例如:npm install express 安装express的最新版本的包到【当前目录】

参数: -g 安装到全局 带空格

   但是在代码中,是没有办法通过require()方法直接调用全局安装的包的。全局安装是为了供命令行使用的,例如全局安装 vmarket,则可以在命令行使用vm命令。

   (??所以一些不是在命令行使用的在代码中使用的包,最好不要全局安装??)//个人观点,待确认

   @版本号 安装指定版本号的包 不带空格

   例如:npm install express@3.0.6

    --save 安装的同时,将信息写入package.json中 带空格

   例如:npm install express --save

   package.json:项目路径中如果有package.json文件,直接使用npm install命令就可以通过dependencies配置安装所有依赖包。项目发布到github时,也就不需要提交node_modules文件夹了。

npm init 会引导你创建一个package.json文件,包括包名称,版本,作者等信息

npm remove <name> 移出包

npm update <name> 更新包

npm ls 列出当前项目(目录)安装的包

参数: -g 列出全局安装的包

    -gl 列出全局安装的包的详细信息

npm root 查看当前项目中所有包的安装目录 

例如:直接输入上面命令即可,无需后面添加某个包名,因为没这个功能和必要

参数: -g 查看全局包的安装目录 

npm help npm帮助

npm help install npm install帮助(貌似这个有问题)实际测试使用:npm install -h更好(使用webstorm自带的terminal终端测试的)

npm下相关(工具|插件|模块)介绍:

1、bower

官网:https://bower.io/

安装bower:npm install -g bower

通过npm 安装bower,后可以直接使用bower的命令。

使用bower安装包:bower install <package>。

bower的正确使用方式:

如何使用包由你决定。我们推荐你使用Bower和 Grunt, RequireJS, Yeoman, and lots of other tools 。或者基于API构建你自己的工作流程。你也可以直接使用已安装的包。

像这样:(用jQuery举例)

<script src="bower_components/jquery/dist/jquery.min.js"></script>

学习用的demo

相关问题:

使用Bower安装模块时出现问题: ENOGIT git is not installed or not in the PATH。

解决办法:假如你的git安装目录是”C:Program Files (x86)Git”,在path中( 系统属性中)加入git的bin和cmd目录,如C:Program Files (x86)Gitin;C:Program Files (x86)Gitcmd。然后重启电脑。(bower基于git工作的,没有正确安装git会报这个错。)

2、gulp.js

gulp.js是什么:官方答案:基于流的自动化构建工具。

官方给的介绍幻灯片http://slides.com/contra/gulp#/ 

官方中文站点:http://www.gulpjs.com.cn

和grunt区别:http://segmentfault.com/a/1190000002491282

入门:

全局安装:npm install -g gulp

项目中安装:npm install --save-dev gulp (-dev代表添加到依赖(package.json的devDependencies))

gulpfile.js:

var gulp = require('gulp');

gulp.task('default',['yilai1','yilai2'],function(){//write your task code});

//default那里写task名称,yilai1,yilai2对应的是task执行前的依赖任务:必须在这些任务执行后才能执行

现在gulp推荐使用ES6来写gulp代码:

import gulp from 'gulp';
gulp.task('test',['task1','task2'],()=>{//write your task code})

运行 gulp <task> <othertask> (不写任何task名称,则运行默认task==》default)

去gulp官网可查看gulp的API

去npm官网可以查看gulp用到的插件的API(英文的,耐心阅读即可使用)

学习用的demo:web-starter-kit。

3、browserify.js 

Browserify 可以让你使用类似于 node 的 require() 的方式来组织浏览器端的 Javascript 代码,通过预编译让前端 Javascript 可以直接使用 Node NPM 安装的一些库。 参考

解释,前端想要模块化,就必须使用require.js或者sea.js或者其他的前端模块发解决方案。但是Browserify可以让你像写node.js代码时一样进行开发,然后使用Browserify 插件编译一下即可。

官网:http://browserify.org/

学习用的demo:

拓展阅读:browserify运行原理分析

SeaJS 和 Browserify 的模块化方案有哪些区别?

前端模块管理器简介

二、react.js难点 需要记忆的知识

官方中文站点:http://reactjs.cn/

已经学到双向数据流哪里了

发现略坑 普通项目可能用不到。大型项目才用得到吧。先慢慢看吧,把教程看完,在尝试着写个demo,或者用哪个AmazeUI React框架写个demo然后就放一放

jsx注释:{/* */} 官方文档中其他的多行注释和单行注释实际操作发现不可以,会报错,就先不用了。

...操作符,展开操作符,返回一个{name:value,name:value} react中的常用用法,{...this.props}返回和上面对应的props,一种简写方式,记住即可

详细可见 传递Props|React

component生命周期

componentWillMount

componentDidMount

componentWillReceiveProps 注意传参 (object nextProps)

shouldComponentUpdate 注意传参 (object nextProp,object nextState) 如果需要在更新组件之前做一定的操作,比如做判断达到某种限定停止更新组件,需要在这里处理

componentWillUpdate 注意传参 (object nextProp,object nextState)

componentDidUpdate 注意传参 (object prevProp,object nextState)

componentWillUnmount

react 的 mixins的目的是就是不同的组件共用一些逻辑。

三、CommonJs规范? AMD规范? CMD规范? common.js? require.js? sea.js?

这个一定要研究透彻了,这个是重点。

答案0.1(有更新过)

#问题前提:js模块化开发

CommonJS、AMD和CMD这三个规范都是为javascript模块化加载而生的。

不存在common.js这东西。require.js和sea.js分别是AMD和CMD两个规范的实现。

Node.js就是原生实现了CommonJS规范。(Node.js是一个Javascript运行环境(runtime)。实际上它是对Google V8引擎进行了封装。了解更多

AMD规范: require.js    ]  http://www.requirejs.cn/

                              }浏览器端

CMD规范: sea.js         ]  http://seajs.org/docs/

CommonJs规范:                                   ->node端采用

CommonJs规范:            借助Browserify工具        ->浏览器端

从历史角度看:(不严格,但可以帮助理解)

JS(ES5以下版本,ES6中有ES6 module)天生不支持模块化,没有类,继承等概念,进行大工程和面向对象开发非常困难。

然后有人/组织提出了CommonJS规范试图解决这个困难。

然后就有人基于这个规范搞出了Node.js。还越来越火。

Node.js这东西实际上属于后端的东西。但是它的语言是js啊,前端这帮人呢,又比较闲,研究来研究去,觉得特别好。就想在前端的方面也这样干。

他们想,我前端也有大的工程啊,如果我也能模块化开发多好啊。于是就有人搞出了require.js。

后来有人不服,搞出了sea.js。(还有人搞出了别的……)

但是啊,Node.js是基于浏览器内核封装的一个运行时环境。require.js,sea.js只是一个js的库。它虽然都做到了前端js的模块化加载。但是它的实现原理是不一样的。

为了区别开发。于是呢他们/全体开发人员都需要,给这两命个名,就是AMD规范和CMD规范。

但是呢,因为它们俩只是一个js的库,就相当于jquery一样,需要运行的时候,先让浏览器加载进去。而开发时写的js代码和普通的js代码也就有点不同了(和JQuery与js的差点小多了,就是需要一些函数嵌套你的所有代码)。有人不习惯啊。觉得很麻烦。

他习惯了Node.js这种开发方式,他就像能不能让前端想后端一样开发。于是就搞出了一个工具,叫Browserify。这货会帮你把你的代码编译一下,让浏览器可以识别运行。(想知道原理,百度吧)

了解更多:

http://javascript.ruanyifeng.com/nodejs/module.html 

推荐:http://www.cnblogs.com/qianshui/p/5216580.html

答案1.0

我的理解: commonJS是一个模块加载规范,他在设计之初就是考虑的服务端,所以他是一个同步的模式,主要是用在node.js后端的,

require.js是依据commonJS的这种规范实现的前端模块化加载工具。然而前端需要的是异步加载,于是AMD(异步加载规范)应运而生。所以说require.js是AMD规范的一个实现。

相关理解https://www.zhihu.com/question/20342350/answer/14828786

答案2.0

相关名词:

CommonJS Modules   ->  Node Modules

AMD(Asynchronous Module Definiton)

CMD(Common Module Definition)

JavaScript 在设计之初不仅仅是针对浏览器之间的语言。后来由于WEB的流行,加之Netscape和Microsoft Internet Explorer之间的竞争,导致JavaScript被过早的标准化。所以JavaScript有很多先天缺陷。比如没有模块(module)(注意不仅是没有module还有很多其他方面的缺陷,这里不冗述)的定义,这导致很难进行大型项目的开发。

于是,CommonJS应运而生!

百度百科给的CommonJS词条简介:

CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API,从而填补了这个空白。它的终极目标是提供一个类似Python,Ruby和Java标准库。这样的话,开发者可以使用CommonJS API编写应用程序,然后这些应用可以运行在不同的JavaScript解释器和不同的主机环境中。在兼容CommonJS的系统中,你可以使用 JavaScript程序开发:

服务器端JavaScript应用程序
命令行工具
图形界面应用程序
混合应用程序(如,Titanium或Adobe AIR)

所以,Module只是CommonJS中的一部分,CommonJS本身很大的。

说到CommonJs,这里不得不提到NodeJS,NodeJS是CommonJS的一个部分实现。是上面说的开发服务器端JavaScript应用程序的一个工具。

所以Node 的 Modules 部分是遵守CommonJs Modules规范的。但是有一点小区别(什么区别,不细追究,用到的时候再说)

所以说,并没有common.js这个工具存在。NodeJs的Module部分已经实现在node的编译器里了?

说到后端,就要说前端。JavaScript运行最多的地方还是浏览器端。

随着WEB页面越来越复杂,浏览器环境也越来越发在,UI和UE需求也变得越来越复杂。前端开发再也不是以前那种一个人单打独斗,甚至美工兼职切图,后端兼职js能够解决的了。

他们也急需模块化工具。于是require.js应运而生。

他可以让前端人员也可以像nodejs开发人员那样模块化地写代码。

但是前端和后端运行环境不懂:

后端是无需下载,一个文件可能被多次运行,他的瓶颈是CPU和内存;

前端是需要下载运行的。而且是一个文件被下载到多个客户端运行,他的瓶颈是网络带宽。

所以后端是同步的请求,而前端是需要异步的请求的。

所以require.js的实现方式和node是有所不同的。所以它另立门户了。于是有了一个新的(前端)规范——AMD规范。

说到require.js,就不得不说sea.js了,它被视作(自视作?)require.js的最大竞争对手。原因在于require.js并不是完全实现commonJS的要求的。他只是依照这个需求自行设计的。

而SeaJS 更简洁优雅,更贴近 CommonJS Modules/1.1 和 Node Modules 规范(作者原话)。sea.js和AMD是不同的,所以它称自己实现了CMD规范。显然,这个CMD规范和CommonJS Modules不是一回事!

相关参考链接:

http://www.2cto.com/kf/201401/270303.html

http://www.2cto.com/kf/201412/363524.html

http://www.2cto.com/kf/201411/348276.html

https://www.zhihu.com/question/20342350/answer/14828786

https://www.douban.com/note/283566440/

http://www.commonjs.org/

http://raychase.iteye.com/blog/1463617

http://baike.baidu.com/link?url=WhxqRwGIpJt3AhX7Zwqf4jIqdmKgKq0D_LP9TW9SQxEXNaadiNCNM01i7y9DbyiQnsTH7-nZWN_tbmAWR1mjEK

更多问题以后研究:

CommonJS的具体内容是什么?

Node是如果实现CommonJS (module) 规范的?

require.js和sea.js的具体区别,实现方式,调用方式的区别?

browserify是干啥的?

四、js的对象类型,彻底搞清楚,变量,数组,json格式等等

尤其是 var a = {name1:function(){},name2:function(){},name3:' '}这是什么结构

百度 js {}对象 w3cschool: javascirpt 对象

初步:这是一个js object 对象,形同:var a = new object({name1:function(){},name2:function(){},name3:' '});

使用a.name1() 访问其封装的属性

var person=new Object();
person.firstname="Bill";
person.lastname="Gates";
person.age=56;
person.eyecolor="blue";

//替代语法(使用对象 literals):

var person = {firstname:"John",lastname:"Doe",age:50,eyecolor:"blue"};

引申:创建数组

var ay = new Array();

ay[0] = 1;
ay[0] = 2;
ay[0] = 3;

//替代语法 (使用数组 literals)
var ay = [1,2,3];

//可以叫做 简写方式?

相关:JavaScript Object Literals & Array Literals

MDN Array_literals    MDN Using_object_initializers

[a]代表什么?

 引申:单体模式 见:js高级视频教程 10.单体模式

JSON:(JavaScript Object Notation) 【javascript对象表示法】

百度百科:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。

JSON是JS的一个子集,所以可以在JS中轻松地读写JSON。读和写JSON都有两种方法,分别是利用”.”操作符和“[key]”的方式。

五、琐碎的一些知识

em 和 rem ,页面设置font-size:100% 和屏幕尺寸,分辨率等的关系详细探究

逻辑与:&&,前面的一个为假时,后面的就不计算(执行)了,例子:$input && $input.trigger('change'); //若$input为undefined,后面不执行。

知识相关:① 逻辑与,逻辑非,逻辑或,按位与………… 一个链接:讲讲js中的逻辑与(&&)以及逻辑或(||)

       ② js中的那些值会返回 true,那些会返回false。   如:undefined返回false,字符串返回true

 font-family:monospace,verdana, helvetica, arial, sans-serif

web字体详细研究

单元测试 详细知识

六、js高级教程视频

进度:

最近看了10-单体,11-链式调用

进度:已经看完,最后的项目还没有跟着做呢,接下来跟着做完那个项目,然后复习一遍

问题:

1、关于js闭包在作用域链,内存垃圾回收机制和函数嵌套方面的理解

七、git学习

compare with the same repository version 和相同的版本库比较

compare with the latest repository version 和最新的版本库比较

解释:就算懂了字面意思,不懂git原理,还是不会理解的。

这个相同的版本库可以理解为 svn的 和 当前版本比较。

用途是为了看自己 在上次commit后改了那些内容。

而和最新的版本库比较

分两种,如果当前的版本就是最新的版本(别人没有提交之类的)

那么和上面没有区别

如果别人也有提交,或者你自己恢复到了之前的版本,那么比较的就不仅仅是当前修改未提交的内容了。

commit 仅提交到本地库

commit and push 提交到本地库,并推送到远程库

1、git使用指南 速成版

首先看一张图:

牢记这张图.

假定你已经有了一个库后,不管是你从github上clone的还是自己新建的。

查看 当前状态 : git status

(修改的文件是绿色的,一旦被add进缓存区会变成红色)

查看 当前远程仓库地址:git remote -v

查看 当前远程仓库:git remote show

查看 当前远程仓库信息:git remote show [remote-name] 举例:git remote show origin

如果没有指定远程仓库,

指定 远程仓库地址 git remote add [remote-name] [url]

如果远程仓库地址不正确了,

切换 远程仓库:git remote set-url origin [url] 举例:git remote set-url origin https://github.com/xxx/xxxx

(切换了记得在看一遍是否成功了)

添加 已修改的文件进缓存区:git add

(可以添加多个文件,git add 文件夹,更多需求直接百度)

(添加了记得 查看一下状态,进了缓存区的文件可是红色的)

撤销 add添加的文件:git reset

(这个直接撤销上一步操作了,具体撤销add后的文件的方法用的时候百度吧)

提交 文件到本地仓库:git commit  (如果先要直接备注:git commit -m "comment here")

输入这个后,如果有错误和警告提示之类的,不要慌,看下去,虽是英文也能看懂的。

没有问题会直接进入vim界面,就是编辑界面。

按 i 可以添加comment

添加完了  按 ESC 键可以退出,继续按 i 还可以编辑

确认无误,按 :wq (没错需要shift+;键输入:)

敲回车即可。

这是你成功的commit了一个文件了。

把这个文件push到远程仓库,直接:git push

(要确保自己的远程仓库没问题啊,不放心参照上面查看一下)

 从远程仓库获取 更新 :git fetch

查看 当前的分支:git branch

切换到 某一分支: git checkout [branch-name]

新建一个分支:git  branch [branch-name]

记住上面这些就可以了,主要是看懂那张图,剩下的命令边用边学吧。

没事时候看看这里:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 记住里面的所有命令。

2、平时用到的陆续记录一下

  1. 查看用户名和邮箱地址:

    $ git config user.name
    
    $ git config user.email
    
  2. 修改用户名和邮箱地址:

    $ git config --global user.name "username"
    
    $ git config --global user.email "email"

   3. 强制从远程仓库对本地修改进行覆盖

    有时候自己改着改着改乱套了,整个项目都出问题了,又不知道从哪里修复。就可以使用这个命令。  

    git fetch --all 

    git reset --hard origin/develop

    第一个命令的意思是取回远程端所有修改。

    第二句的意思是将版本号置到develop这个版本上。当然如果你需要置的是你自己的私有版本,也可以置到私有版本号上。

    到这里再使用git pull去取项目的时候,就不会报修改未提交的问题了。

  4. git fetch 和 git pull 的区别

    git fetch:相当于从远程获取最新版到本地,不会自动merge

    git pull:相当于从远程获取最新版到本地,并自动merge

    了解更多:http://blog.csdn.net/wfdtxz/article/details/8632811

    深入了解:http://blog.csdn.net/a19881029/article/details/42245955

  5.fork之后如何向原作者贡献代码(了解即可)

    链接:http://www.open-open.com/lib/view/open1420683474953.html

  6.本地创建仓库向远程(github)推送

    先在远程创建一个同名的仓库,然后在本地指定远程仓库地址,然后再push。

    如果远程创建仓库的时候没有创建README.md,再从本地push会报错:fatal the current branch master has no upstream branch

    解决办法:http://blog.csdn.net/qqb123456/article/details/25319659

    上述办法核心:git push -u origin master

……

原文地址:https://www.cnblogs.com/ferron/p/5129368.html