作者: admin

  • npm笔记

    关于环境变量的设置请看:https://sdeno.com/?p=4740

    nodejs的出现,可以算是前端里程碑式的一个事件,它让前端攻城狮们摆脱了浏览器的束缚,踏上了一个更加宽广的舞台。前端的可能性,从此更加具有想象空间。

    随着一系列基于nodes的应用/工具的出现,工作中与nodejs打交道的机会越来越多。无论在node应用的开发,还是使用中,包管理都扮演着一个很重要的作用。NPM(node package manager),作为node的包管理工具,极大地便利了我们的开发工作,很有必要了解一下。

    NPM是什么

    NPM(node package manager),通常称为node包管理器。顾名思义,它的主要功能就是管理node包,包括:安装、卸载、更新、查看、搜索、发布等。

    npm的背后,是基于couchdb的一个数据库,详细记录了每个包的信息,包括作者、版本、依赖、授权信息等。它的一个很重要的作用就是:将开发者从繁琐的包管理工作(版本、依赖等)中解放出来,更加专注于功能的开发。

    npm官网: https://npmjs.org/

    npm官方文档: https://npmjs.org/doc/README.html

    我们需要了解什么

    1. npm的安装、卸载、升级、配置
    2. npm的使用:package的安装、卸载、升级、查看、搜索、发布
    3. npm包的安装模式:本地 vs 全局
    4. package.json:包描述信息
    5. package版本:常见版本声明形式

    npm包安装模式

    在具体介绍npm包的管理之前,我们首先得来了解一下npm包的两种安装模式。

    本地安装 vs 全局安装(重要)

    node包的安装分两种:本地安装、全局安装。两者的区别如下,后面会通过简单例子说明

    • 本地安装:package会被下载到当前所在目录,也只能在当前目录下使用。
    • 全局安装:package会被下载到到特定的系统目录下,安装的package能够在所有目录下使用。

    npm install pkg – 本地安装

    运行如下命令,就会在当前目录下安装 grunt-cli (grunt命令行工具)

    npm install grunt-cli

    安装结束后,当前目录下回多出一个 node_modules 目录,grunt-cli就安装在里面。同时注意控制台输出的信息:

    grunt-cli@0.1.9 node_modules/grunt-cli
    ├── resolve@0.3.1
    ├── nopt@1.0.10 (abbrev@1.0.4)
    └── findup-sync@0.1.2 (lodash@1.0.1, glob@3.1.21)

    简单说明一下:

    • grunt-cli@0.1.9:当前安装的package为grunt-cli,版本为0.19
    • node_modules/grunt-cli:安装目录
    • resolve@0.3.1:依赖的包有resolve、nopt、findup-sync,它们各自的版本、依赖在后面的括号里列出来

    npm install -g pkg- 全局安装

    上面已经安装了grunt-cli,然后你跑到其他目录下面运行如下命令

    grunt

    果断提示你grunt命令不存在,为什么呢?因为上面只是进行了 本地安装 ,grunt命令只能在对应安装目录下使用。

    -bash: grunt: command not found

    如果为了使用grunt命令,每到一个目录下都得重新安装一次,那不抓狂才怪。肿么办呢?

    很简单,采用全局安装就行了,很简单,加上参数 -g 就可以了

    npm install -g grunt-cli

    于是,在所有目录下都可以无压力使用 grunt 命令了。这个时候,你会注意到控制台输入的信息有点不同。主要的区别在于安装目录,现在变成了/usr/local/lib/node_modules/grunt-cli ,/usr/local/lib/node_modules/ 也就是之前所说的全局安装目录啦。

    grunt-cli@0.1.9 /usr/local/lib/node_modules/grunt-cli
    ├── resolve@0.3.1
    ├── nopt@1.0.10 (abbrev@1.0.4)
    └── findup-sync@0.1.2 (lodash@1.0.1, glob@3.1.21)

    npm包管理

    npm的包管理命令是使用频率最高的,所以也是我们需要牢牢记住并熟练使用的。其实无非也就是几个动作:安装、卸载、更新、查看、搜索、发布等。

    安装最新版本的grunt-cli

    npm install grunt-cli

    安装0.1.9版本的grunt-cli

    npm install grunt-cli@"0.1.9"

    通过package.json进行安装

    如果我们的项目依赖了很多package,一个一个地安装那将是个体力活。我们可以将项目依赖的包都在package.json这个文件里声明,然后一行命令搞定

    npm install

    其他package安装命令

    运行如下命令,列出所有 npm install 可能的参数形式

    npm install --help

    输出如下,有兴趣的童鞋可以了解下

    npm install <tarball file>
    npm install <tarball url>
    npm install <folder>
    npm install <pkg>
    npm install <pkg>@<tag>
    npm install <pkg>@<version>
    npm install <pkg>@<version range>

    卸载grunt-cli

    比如卸载grunt-cli

    npm uninstall grunt-cli

    卸载0.1.9版本的grunt-cli

    npm uninstall grunt-cli@"0.1.9"

    npm ls:查看安装了哪些包

    运行如下命令,就可以查看当前目录安装了哪些package

    npm ls

    输出如下

    /private/tmp/npm
    └─┬ grunt-cli@0.1.9
      ├─┬ findup-sync@0.1.2
      │ ├─┬ glob@3.1.21
      │ │ ├── graceful-fs@1.2.3
      │ │ ├── inherits@1.0.0
      │ │ └─┬ minimatch@0.2.12
      │ │   ├── lru-cache@2.3.0
      │ │   └── sigmund@1.0.0
      │ └── lodash@1.0.1
      ├─┬ nopt@1.0.10
      │ └── abbrev@1.0.4
      └── resolve@0.3.1

    输出如下,同样,如果是要查看package的全局安装信息,加上 -g 就可以

    npm ls pkg:查看特定package的信息

    运行如下命令,输出grunt-cli的信息

    npm ls grunt-cli

    输出的信息比较有限,只有安装目录、版本,如下:

    /private/tmp/npm
    └── grunt-cli@0.1.9 

    如果要查看更详细信息,可以通过 npm info pkg ,输出的信息非常详尽,包括作者、版本、依赖等。

    npm info grunt-cli

    npm update pkg:package更新

    npm update grunt-cli

    npm search pgk:搜索

    输入如下命令

    npm search grunt-cli

    返回结果如下

    npm http GET http://registry.npmjs.org/-/all/since?stale=update_after&startkey=1375519407838
    npm http 200 http://registry.npmjs.org/-/all/since?stale=update_after&startkey=1375519407838
    NAME                  DESCRIPTION                                        AUTHOR            DATE              KEYWORDS
    grunt-cli             The grunt command line interface.                  =cowboy =tkellen  2013-07-27 02:24
    grunt-cli-dev-exitprocess The grunt command line interface.              =dnevnik          2013-03-11 16:19
    grunt-client-compiler Grunt wrapper for client-compiler.                 =rubenv           2013-03-26 09:15  gruntplugin
    grunt-clientside      Generate clientside js code from CommonJS modules  =jga              2012-11-07 01:20  gruntplugin

    npm发布

    这个命令我自己也还没实际用过,不误导大家,语法如下,也可参考官方对于package发布的说明 https://npmjs.org/doc/developers.html :

    npm publish <tarball>
    npm publish <folder>

    NPM配置

    npm的配置工作主要是通过 npm config 命令,主要包含增、删、改、查几个步骤,下面就以最为常用的proxy配置为例。

    设置proxy

    内网使用npm很头痛的一个问题就是代理,假设我们的代理是 http://proxy.example.com:8080,那么命令如下:

    npm config set proxy http://proxy.example.com:8080

    由于 npm config set 命令比较常用,于是可以如下简写

    npm set proxy http://proxy.example.com:8080    

    查看proxy

    设置完,我们查看下当前代理设置

    npm config get proxy

    输出如下:

    同样可如下简写:

    npm get proxy

    删除proxy

    代理不需要用到了,那删了吧

    npm delete proxy

    查看所有配置

    npm config list

    直接修改配置文件

    有时候觉得一条配置一条配置地修改有些麻烦,就直接进配置文件修改了

    npm config edit

    关于package.json

    这货在官网似乎没有详细的描述,其实就是包的描述信息啦。假设当我们下载了node应用,这个node应用依赖于A、B、C三个包,如果没有package.json,我们需要人肉安装这个三个包(如果对版本有特定要求就更悲剧了):

    npm install A
    npm install B
    npm install C

    有了package.json,一行命令安装所有依赖。

    npm install

    package.json字段简介

    字段相当多,但最重要的的是下面几个

    1. name: package的名字(由于他会成为url的一部分,所以 non-url-safe 的字母不会通过,也不允许出现”.”、”_”),最好先在 http://registry.npmjs.org/上搜下你取的名字是否已经存在
    2. version: package的版本,当package发生变化时,version也应该跟着一起变化,同时,你声明的版本需要通过semver的校验(semver可自行谷歌)
    3. dependencies: package的应用依赖模块,即别人要使用这个package,至少需要安装哪些东东。应用依赖模块会安装到当前模块的node_modules目录下。
    4. devDependencies:package的开发依赖模块,即别人要在这个package上进行开发
    5. 其他:参见官网

    package版本

    在package.json里,你经常会在包名后看到类似”~0.1.0″这样的字符串,这就是包的版本啦。下面会列举最常见的版本声明形式,以及版本书写的要求:

    常见版本声明形式

    a、”~1.2.3″ 是神马意思呢,看下面领悟

    "~1.2.3" = ">=1.2.3 <1.3.0"
    "~1.2" = ">=1.2.0 <1.3.0"
    "~1" = ">=1.0.0 <1.1.0"

    b、”1.x.x”是什么意思呢,继续自行领悟

    "1.2.x" = ">=1.2.0 <1.3.0"
    "1.x.x" = ">=1.0.0 <2.0.0"
    "1.2" = "1.2.x"
    "1.x" = "1.x.x"
    "1" = "1.x.x"

    版本书写要求

    1. 版本可以v开头,比如 v1.0.1(v只是可选)
    2. 1.0.1-7,这里的7是所谓的“构建版本号”,不理是神马,反正版本大于1.0.1
    3. 1.0.1beta,或者1.0.1-beta,如果1.0.1后面不是 “连字符加数字” 这种形式,那么它是pre release 版本,即版本小于 1.0.1
    4. 根据b、c,有:0.1.2-7 > 0.1.2-7-beta > 0.1.2-6 > 0.1.2 > 0.1.2beta

    写在后面

    内容只是简单地把最常见的命令,以及一些需要了解的内容列了出来。如要进一步了解,可参考官网说明。此外, npm help 是我们最好的朋友,如果忘了有哪些命令,命令下有哪些参数,可通过help进行查看。

    最关键的:如果文章内容有误,请指出!!!

     

    http://www.tuicool.com/articles/VB7nYn

     

     

     

    node 模块本地安装 离线安装

    npm用法及离线安装方法

    基本的用法

    查看某个模块的全部信息,或者可以查看单个信息

    npm view jquery versions   //查看可用的所有版本
    npm info name
    npm info name version
    npm info name homepage

    install支持多种手段,包名,git路径,包括本地路径也可以

    sudo npm install -global [package name]
    npm install git://github.com/package/path.git
    npm install git://github.com/package/path.git#0.1.0
    npm install package_name@version
    npm install path/to/somedir  //本地路径

    前提是本地路径里面包含一个完整的包,或者文件里面有合格的package.json文件即可

    查看装好了哪些包

    npm list
    npm -global list

    配置文件基本用法

    配置就是修改npmrc文件了。用命令行同样也是修改此文件。
    npmrc存在三个位置,修改用户目录下的文件就更合适了。
    ~/.npmrc             (用户主目录,win系统在C:\Users\$用户名\.npmrc)

    修改文件就不用说了,命令配置方法

    npm config set key=value
    npm config set proxy=http://127.0.0.1:8087

    具体的用法和具体key value可以通过打开说明文档查看

    npm help npm

    配置项可以通过以下命令查看已经配置过的项

    npm config list
    npm config list -l

    配置代理,全局目录,源

    下面正式介绍对付国内网络的方法了

    首先几个重要的配置项一一介绍

    prefix   — 全局安装的路径,也就是npm install -g 安装的模块在哪个位置。这个看个人喜好。我喜好将他设置到安装路径下面。

    proxy — 代理(http的代理是用这个),代理连外网的朋友这个就需要配置了。

    https_proxy — https代理

    registry — 类似linux的软件源,这个一定要修改的

    npm config set prefix "c:\nodejs"
    npm config set proxy=http://127.0.0.1:8087
    npm config set https_proxy=http://127.0.0.1:8087
    npm config set registry=http://registry.npmjs.org

    registry=http://registry.npmjs.org 这句很重要,注意默认的源是https://registry.npmjs.org 是https的,反正我连默认的源是从来没成功过一次。
    上例我把他修正为不加密http的就基本能正常了。

    网络不行可以考虑一些国内的源试试,例如

    npm config set registry "http://r.cnpmjs.org/"

    离线安装

    有许多环境下即便配置了代理,修改了源还是出现网络问题。常见的提示是shasum check failed。当然这不一定就是网络不行,但大部分情况下是网络连接不通畅导致的。

    这种情况下可以手工下载并安装,其实也很简单。

    首先找到想办法把你需要的包下载下来,这个可以多种办法了。或者从其他机器拷过来。

    例如先npm info mysql 查看mysql这个包的信息,包信息里面会有软件主页或者代码仓库地址。一半在github上。(install因为要下载可能会失败,但是info指令信息少通常可以成功)。

    例如node-mysql的地址在https://github.com/felixge/node-mysql

    下载来之后解压到工程的node_modules目录下就是安装好了,就这么简单。

    Project

      —package.json

      —index.js

      —node_modules      // 解压到此目录就行了(每个包文件夹下面有package.json,index.js文件的。)

    注意:你下载下来的源码包可能和模块名字不一样。要将改名成模块名再拷贝进node_modules 中去。例如将node-mysql文件夹改名成mysql。

    包之间的依赖关系离线安装问题

    上面方法安装的包不会包含依赖的包,不过依赖包同样用上面离线一个个安装的办法也可以。

    例如mysql包就依赖bignumber.js , readable-stream , require-all 三个包。npm默认情况下安装的依赖包会是一层一层往下的。例如安装好mysql工程结构会是这样的

    Project

      —package.json

      —index.js

      —node_modules

          —mysql

              —node_modules

                  —bignumber.js

                  —readable-stream

                  —require-all

    你同样只需要相同的操作将依赖的包放到相应的位置便可。这样包管理的结构虽然复杂但是依赖关系很清晰。但是这个规定不一定非要这样,你也可以将依赖包放到第一层的node_modules文件夹下。nodejs搜索模块路径会一层一层往上搜索。

    http://www.cnblogs.com/laozhbook/p/npm_help.html

     

     

     

  • jQuery队列函数同步执行queue()、dequeue()、clearQueue()和.delay()

    js jquery 同步 回调 队列

    var _slideFun=[
     //把要执行的动画依次放入一个数组,并且按顺序执行,同步
       function(){$('.one').delay(500).animate({top:'+=270px'},500,_takeOne);}, //先执行
       function(){$('.two').delay(300).animate({top:'+=270px'},500,_takeOne);}, //再执行,以此类推
       function(){$('.three').delay(6300).animate({top:'+=270px'},500,_takeOne);},
       function(){$('.four').delay(300).animate({top:'+=270px'},500,_takeOne);},
       function(){$('.five').delay(300).animate({top:'+=270px'},500,_takeOne);},
       function(){$('.six').delay(300).animate({top:'+=270px'},500,_takeOne);},
       function(){$('.seven').delay(300).animate({top:'+=270px'},500,function(){
          alert('按序落体运动结束! Yeah!');
       });}
     ];
    
    
    $('#demo').queue('slideList',_slideFun); //将所有的动作都放入到名字为'slideList'的队伍中,但是并没执行。
    
    var _takeOne=function(){
       $('#demo').dequeue('slideList'); //删除队伍slideList中的最前面的函数,并执行。
    };
     _takeOne();
    
    
    $(':button').click(function(){
        $(this).val('刷新重试').attr('disabled',true).css('color','#ccc');
        //停止也可用载入空数组实现$('#demo').queue('slideList',[]);
        $('#demo').clearQueue('slideList');//执行完函数后,就不执行后面函数了
    });

    http://demo.jb51.net/js/jquery_queue/index.htm

  • 原生ajax笔记

    _ajax笔记.txt

     //以下是同步
     var xhr=new XMLHttpRequest(); //用ajax就要创建一个XHR对象,这个不兼容IE6
     jQuery(document).click(function(){
      xhr.open('get','1.php?'+Math.random(),false); //get方式,请求地址1.php,同步。这步只是负责工作前的准备,没真正启动ajax。
      xhr.send(null);//如果有数据顺便发送给服务器就填写,如果没有也必须要写null,真正启动ajax
      if(xhr.status==200){ //要想获取服务器传过来的数据就要判断,是否请求成功
        document.title=xhr.responseText;//从服务器获取到的数据
      }else{
        document.title='出错';
      }
     });

     

    //以下是异步
     var xhr=new XMLHttpRequest(); //用ajax就要创建一个XHR对象,这个不兼容IE6
     jQuery(document).click(function(){
      xhr.onreadystatechange=function(){
        if(xhr.status==200 && xhr.readyState==4){ //要想获取服务器传过来的数据就要判断,是否请求成功
          document.title=xhr.responseText;//从服务器获取到的数据
          // xhr.getAllResponseHeaders(); //获取到响应的全部信息
          // xhr.getResponseHeader('Content-Type'); //获取 Content-Type信息
        }else{
            document.title='出错';
        }
      }
      xhr.open('get','1.php?'+Math.random(),true);
      xhr.send(null);//如果有数据顺便发送给服务器就填写,如果没有也必须要写null,真正启动ajax
      //xhr.abort() //这里取消异步
     });

     

    //异步,用post方式,向服务器传递数据
     var xhr=new XMLHttpRequest(); //用ajax就要创建一个XHR对象,这个不兼容IE6
     jQuery(document).click(function(){
       xhr.onreadystatechange=function(){
         if(xhr.status==200 && xhr.readyState==4){ //要想获取服务器传过来的数据就要判断,是否请求成功
              document.title=xhr.responseText;//从服务器获取到的数据
           // xhr.getAllResponseHeaders(); //获取到响应的全部信息
           // xhr.getResponseHeader('Content-Type'); //获取 Content-Type信息
         }else{
              document.title='出错';
         }
       }
       xhr.open('post','1.php?'+Math.random(),true);
       xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); //模拟表单提交,不然用post提交数据给服务器是接受不到数据的
       xhr.send('name=xgllseo&age=100');//这些写你要传递的数据,如果没有也必须要写null,真正启动ajax
     });

     

     //获取json数据
     var xhr=new XMLHttpRequest(); //用ajax就要创建一个XHR对象,这个不兼容IE6
     jQuery(document).click(function(){
         xhr.onreadystatechange=function(){
           if(xhr.status==200 && xhr.readyState==4){ //要想获取服务器传过来的数据就要判断,是否请求成功
              document.title=JSON.parse(xhr.responseText);//获取json数据
           }else{
              document.title='出错';
           }
          }
          xhr.open('get','1.json?'+Math.random(),true);
          xhr.send('name=xgllseo&age=100');//这些写你要传递的数据,如果没有也必须要写null,真正启动ajax
     });

     

     

    //跨域 并发送数据给服务器
    function ajax(params) { 
     params = params || {}; 
     params.data = params.data || {}; 
     var json = params.jsonp ? jsonp(params) : json(params); 
     // jsonp请求 
     function jsonp(params) { 
     //创建script标签并加入到页面中 
     var callbackName = params.jsonp; 
     var head = document.getElementsByTagName('head')[0]; 
     // 设置传递给后台的回调参数名 
     params.data['callback'] = callbackName; 
     var data = formatParams(params.data); 
     var script = document.createElement('script'); 
     head.appendChild(script); 
     //创建jsonp回调函数 
     window[callbackName] = function(json) { 
       head.removeChild(script); 
       clearTimeout(script.timer); 
       window[callbackName] = null; 
         params.success && params.success(json); 
       }; 
      //发送请求 
     script.src = params.url + '?' + data; 
     //为了得知此次请求是否成功,设置超时处理 
      if(params.time) { 
        script.timer = setTimeout(function() { 
          window[callbackName] = null; 
          head.removeChild(script); 
          params.error && params.error({ 
            message: '超时' 
          }); 
        }, time); 
       } 
     }; 
     //格式化参数 
     function formatParams(data) { 
     var arr = []; 
     for(var name in data) { 
     arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name])); 
     }; 
     // 添加一个随机数,防止缓存 
     arr.push('v=' + random()); 
     return arr.join('&'); 
     } 
     // 获取随机数 
     function random() { 
       return Math.floor(Math.random() * 10000 + 500); 
     }
    }
    
    
    
    ajax({ 
     url: 'test', // 请求地址
     jsonp: 'jsonpCallback', // 采用jsonp请求,且回调函数名为"jsonpCallbak",可以设置为合法的字符串
     data: {'b': '异步请求'}, // 传输数据
     success:function(res){ // 请求成功的回调函数
       console.log(res); 
     },
     error: function(error) {} // 请求失败的回调函数
    });
    
    
    
    服务器设置:
    $data='[{name:"chenge"},{age:24}]'; //这里就是要返回给客户端的数据,必须还是json格式的,不然就出错。之前设置了也必须设置dataType:"jsonp"
    $str=$_GET['callback'].'('.$data.')';
    echo $str;

     

     

     

  • css计算宽度calc()

    css3 计算 宽度 并行 并排

    如果一行上有3个DIV,其中2个DIV宽度固定,另一个宽度自适应,为了让3个DIV并行,另一个DIV宽度自适应改变才行。

    用JS可以控制感觉有点多余,用CSS3属性可以完成例如:

    width:-webkit-calc(100% - 60px);
    width:-moz-calc(100% - 60px);
    width:calc(100% - 60px);