2018年7月

常用命令

npm是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,只要你安装了node就已经安装了npm,你可以通过npm --version来查看自己是否安装了npm,如果显示版本号,则证明已经安装了。如果想升级npm可以直接通过npm自己来升级npm install --global npm
常用命令:

  • npm init [-y] 生成package.json 包描述文件。其中的dependencies 选项的作用,可以帮我们保存第三方包的名字。如果删除了node_modules也不用担心,我们只需要执行npm install就可以把package.jsondependencies中所有的依赖全部下载下来。
  • npm install (npm i)一次性把dependencies中的全部的依赖项全部下载下来。
  • npm install (npm i 包名)把需要的包下载下来。
  • npm uninstall 包名(npm un [包名]) 删除下载的包。
  • npm update 包名 更新。
  • npm ls 列出当前安装的了所有包。
  • npm help 帮助,如果要单独查看某个命令的帮助,可以使用的npm help 命令名

解决npm被墙问题

方法一:
安装cnpm:npm install -g cnpm --registry=https://registry.npm.taobao.org
方法二:把下载源改了。

核心模块

  • 使用的时候就可以通过 require('包名') 的方式来进行加载才可以使用。
  • 核心模块的本质也是文件。
  • 核心模块文件已经被编译到了二进制文件中了,我们只需要按照名字来加载就可以了。

第三方模块

  • 凡是第三方模块都必须通过 npm 来下载。
  • 使用的时候就可以通过 require('包名') 的方式来进行加载才可以使用。
  • 注意:

    • 不可能有任何一个第三方包和核心模块的名字是一样的。
    • 第三方模块既不是核心模块、也不是路径形式的模块。
    • 它的加载原理如下:

      • 先找到当前文件所处目录中的 node_modules 目录(从该文件的位置开始,一层层的向上查询,直到找到该目录,或者找到磁盘根目录)。
    • 找到该模块的文件夹。
    • 找到该模块的文件夹内的package.json 文件。
    • 找到该模块的文件夹内的package.json 文件中的 main 属性。
    • main 属性中就记录了 art-template 的入口模块。
    • 然后加载使用这个第三方包,实际上最终加载的还是文件。
    • 如果 package.json 文件不存在或者 main 指定的入口模块是也没有,则 node 会自动找该目录下的 index.js,也就是说 index.js 会作为一个默认备选项。
    • 如果以上所有任何一个条件都不成立,则会进入上一级目录中的 node_modules 目录查找如果上一级还没有,则继续往上上一级查找。如果直到当前磁盘根目录还找不到,最后报错:can not find module xxx var template = require('art-template')
    • 我们一个项目有且只有一个 node_modules,放在项目根目录中,这样的话项目中所有的子目录中的代码都可以加载到第三方包,不会出现有多个 node_modules
    • 模块查找机制

      • 优先从缓存加载
      • 核心模块
      • 路径形式的文件模块
      • 第三方模块

非路径形式的模块标识(自己写的模块)

  • 路径形式的模块:

    • ./ 当前目录,不可省略
    • ../ 上一级目录,不可省略
    • /xxx 绝对路径,从该文件的磁盘根目录开始(几乎不用)
    • d:/a/foo.js 绝对路径(几乎不用)
    • 首位的 / 在这里表示的是当前文件模块所属磁盘根路径
    • .js 后缀名可以省略
  • 引入方式require('./foo.js')

  • 在 Node 中,每个模块内部都有一个自己的 module 对象。
  • module 对象中,有一个成员叫:exports 也是一个对象。
  • 我们可以把需要导出的成员都挂载到 module.exports 接口对象中,也就是:moudle.exports.xxx = xxx 的方式,但是每次都 moudle.exports.xxx = xxx 很麻烦,点儿的太多了,所以 Node 为了你方便,同时在每一个模块中都提供了一个成员叫:exports,也就是说:exports === module.exports 结果为 true,所以对于:moudle.exports.xxx = xxx 的方式 完全可以:expots.xxx = xxx。
  • 当一个模块需要导出单个成员的时候,这个时候必须使用:module.exports = xxx 的方式,不要使用 exports = xxx 不管用,因为每个模块最终向外 return 的是 module.exports。
  • exports 只是 module.exports 的一个引用。
  • 所以即便你为 exports = xx 重新赋值,也不会影响 module.exports,但是有一种赋值方式比较特殊:exports = module.exports 这个用来重新建立引用关系的。

  1. 如果系统还没有安装git,请先安装git:yum install git
  2. 然后从 github clone nvm 到本地, git clone https://github.com/cnpm/nvm.git
  3. 配置终端启动时自动执行 source ~/git/nvm/nvm.sh, 在 ~/.bashrc, ~/.bash_profile, ~/.profile, 或者 ~/.zshrc 文件添加以下命令:source ~/git/nvm/nvm.sh
  4. 最后通过nvm安装你需要的版本nvm install 10.7.0
  5. 检测是否成功,输入node --v显示版本号就成功了。

1.首先查看ifconfig所在的命令包:yum search ifconfig
0.png
2.安装该命令包:yum install net-tools.x86_64,安装过程中需要两次确认,直接输入y就行。
1.png
3.安装成功之后就可以使用ifconfig命令了。

  • 在移动端浏览器会遇见点击出现高亮的效果,在某项项目是不需要这个默认的效果的。那么我们通常会把这个点击的颜色设置成透明。当然也可以设置成自己喜欢的颜色。
    -webkit-tap-highlight-color:transparent;/清除点击高亮效果/
  • 通过css3的新属性box-sizing我们能够让盒子有限顾及自己的尺寸而不是内容,避免出现多余的滚动条。

    -webkit-box-sizing: border-box;/*webkit内核兼容性写法*/
    box-sizing: border-box;
  • 在移动设备的浏览器中input标签一般会有默认的样式,通过border=none,outline=none无法去除,比如立体效果,3d效果等等,我们需要添加下列样式。
    -webkit-appearance: none;/*在移动端清除浏览器默认样式*/
  • 考虑到移动设备在大尺寸的的屏幕不会过度缩放 失去清晰度,在小尺寸的屏幕中不会出现布局错乱的问题。

    max-width: 640px;  /*在行业当中的移动端的设计图一般使用的是640px*/
    min-width: 300px;  /*在移动设备当中现在最小的尺寸320px*/
  • nth-child()如果有多个不同兄弟节点获取的时候,索引需要特殊计算,我们可以限定在某一个类型上,语法如下

    • E:first-of-type匹配同类型中的第一个元素E。
    • E:last-of-type匹配同类型中的最后一个元素E。
    • E:nth-of-type(n) 匹配同类型中的第n个元素E。

viewport 是用户网页的可视区域。如果把移动设备的浏览器(也有可能是app中的webview) ,当做相框的话,viewport就相当于相框中的画,可能会比相框小,可能会比相框大,最好是一样大。该属性最早是苹果公司在Safari中推出用来解决移动设备的viewport问题的.后来被各大安卓以及浏览器厂商效仿,所以说这个属性真的是非常有用的。
语法设置:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">

标签值:

  • width:设置layout viewport 的宽度,为一个正整数,或字符串"width-device"。
  • initial-scale:设置页面的初始缩放值,为一个数字,可以带小数。
  • minimum-scale:允许用户的最小缩放值,为一个数字,可以带小数。
  • maximum-scale:允许用户的最大缩放值,为一个数字,可以带小数。
  • height:设置layout viewport 的高度,这个属性对我们并不重要,很少使用。
  • user-scalable:是否允许用户进行缩放,值为"no"或"yes", no 代表不允许,yes代表允许。

Emmet语法中,输入meta:vp,然后按tab键,会自动生成viewport的代码。

$.ajax({}) 方法

参数很多,可以通过手册来使用,在这里简单写一个小案例,说一下比较常用的参数。

$.ajax({
        url:'01.php',//请求地址
        data:'name=fox&age=18',//发送的数据
        type:'GET',//请求的方式
        success:function (argument) {},// 请求成功执行的方法
        beforeSend:function (argument) {},// 在发送请求之前调用,可以做一些验证之类的处理
        error:function (argument) {console.log(argument);},//请求失败调用
    })

$.get()方法

参数列表

参数描述
url必需。规定将请求发送的哪个 URL。
data可选。规定连同请求发送到服务器的数据。
success(response,status,xhr)可选。规定当请求成功时运行的函数。额外的参数:response - 包含来自请求的结果数。status - 包含请求的状态。xhr - 包含 XMLHttpRequest 对象
dataType可选。规定预计的服务器响应的数据类型。默认地,jQuery 将智能判断。可能的类型:"xml"、"html"、"text"、"script"、"json"、"jsonp"。

注意:我们在向服务器提交数据时,如果使用的是Ajax需要手动将数据格式化name=fox&age=10类似这样的格式,JQuery已经帮助我封装好了一个格式化数据的方法$('form').serialize()

$.post()方法

参数列表:

参数描述
url必需。规定把请求发送到哪个 URL。
data可选。映射或字符串值。规定连同请求发送到服务器的数据。
success(data, textStatus, jqXHR)可选。请求成功时执行的回调函数。
dataType可选。规定预计的服务器响应的数据类型。默认地,jQuery 将智能判断。可能的类型:"xml"、"html"、"text"、"script"、"json"、"jsonp"。

Asynchronous Javascript And XML(异步JavaScript和XML),他并不是凭空出现的新技术,而是对于现有技术的结合:核心是js对象XMLHttpRequest。
Ajax的使用一共分为5步
1.建立XMLHTTPRequest对象
2.注册回调函数

  • 当服务器回应我们了,我们想要执行什么逻辑

3.使用open方法设置和服务器端交互的基本信息,即:设置提交的网址,数据,post提交的一些额外内容
设置发送的数据,开始和服务器端交互
4.发送数据
5.处理响应,在注册的回调函数中,获取返回的数据,处理返回回来的数据。

示例代码:GET

get的数据,直接在请求的url中添加即可

<script type="text/javascript">
    // 创建XMLHttpRequest 对象
    var xml = new XMLHttpRequest();
    // 设置跟服务端交互的信息
    xml.open('get','01.ajax.php?name=fox');
    xml.send(null);    // get请求这里写null即可
    // 接收服务器反馈
    xhr.onreadystatechange = function () {
        // 这步为判断服务器是否正确响应
        if (xhr.readyState == 4 && xhr.status == 200) {
            // 打印响应内容
            alert(xml.responseText);
        } 
    };
</script>

示例代码:POST

<script type="text/javascript">
    // 异步对象
    var xhr = new XMLHttpRequest();
    // 设置属性
    xhr.open('post', '02.post.php' );
    // 如果想要使用post提交数据,必须添加
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    // 将数据通过send方法传递
    xhr.send('name=fox&age=18');
    // 发送并接受返回值
    xhr.onreadystatechange = function () {
    // 这步为判断服务器是否正确响应
    if (xhr.readyState == 4 && xhr.status == 200) {
           alert(xhr.responseText);
        } 
    };
</script>

注意:
1.创建XMLHttpRequest对象(兼容性写法)
新版本浏览器:var xml=new XMLHttpRequest();
(IE5 和 IE6):var xml=new ActiveXObject("Microsoft.XMLHTTP");
考虑兼容性创建Ajax对象

 var request ;
 if(XMLHttpRequest){
    // 新式浏览器写法
    request = new XMLHttpRequest();
 }else{
    //IE5,IE6写法
    new ActiveXObject("Microsoft.XMLHTTP");
 }

2.发送请求:

方法描述
open(method,url,async)规定请求的类型、URL 以及是否异步处理请求。 method:请求的类型;GETPOSTurl:文件在服务器上的位置async:true(异步)或 false(同步)
send(string)将请求发送到服务器。string:仅用于 POST 请求

3.onreadystatechange事件

当服务器给予我们反馈时,我们需要实现一些逻辑

属性描述
onreadystatechange存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
readyState存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。(0: 请求未初始化1: 服务器连接已建立2: 请求已接收3: 请求处理中4: 请求已完成,且响应已就绪。)
status200: "OK"。404: 未找到页面

附录:封装的方法:

function ajax(option) {
  // 创建对象
  var xmlRequest ;
  if (XMLHttpRequest) {
      xmlRequest = new XMLHttpRequest();
  }else{
      xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");

  }

  // 格式化传入的数据为name=fox&age=18这样的格式
  var formatStr = "";
  for(var item in option.data){
      // 获取属性名,属性值,进行拼接
      formatStr+=item;// 属性名
      formatStr+="=";//等号
      formatStr+=option.data[item];//属性值
      formatStr+="&";//分隔符
  }

  // 去除最后一个&
  formatStr = formatStr.slice(0,-1);

  // open方法 如果是get方法,那么url之后需要添加数据
  if(option.method == "get"){
      option.url = option.url+"?"+formatStr;
      option.data = null;
  }
  // 调用open方法
  xmlRequest.open(option.method,option.url)

  // 如果是post设置HTTP协议头
  if (option.method=="post") {
      xmlRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  }

  // send方法 这里的data已经是修改过的,如果使用的是get方法,那么data为null
      xmlRequest.send(option.data);

  // 判断状态改变,调用方法
  xmlRequest.onreadystatechange = function () {
  // 这步为判断服务器是否正确响应
  if (xhr.readyState == 4 && xhr.status == 200) {
             option.success(这里的数据是ajax获取的);  
     } 
  };
}

wphp中上传文件并保存的时候,在html表单中需要设置enctype="multipart/form-data",并且只能post方式 PHP接收文件可以通过$_FILES来获取。文件上传到服务器之后就会生成一个临时文件.tmp.tmp文件一会就被自动删除。服务器返回的内容中,有文件的名字以及上传文件保存的位置。如果让文件长期存储,我们将其移动到其他的位置即可。
html代码如下:

<form action='xx.php' method='post' enctype='multipart/form-data'>
    <input type='file' name='icon'>
    <input type='submit'>
</form>

服务器端代码:

<?php
// 可以打印 $_FILES的所有信息
print_r($_FILES);
move_uploaded_file($_FILES['photo']['tmp_name'], './images/test.jpg');
?>

注意:

  • $_FILES用法跟$_GET,$_POST类似,都是关系型数组。
  • #_FILE['key']:可以获取对应上传的文件,这里的key跟提交时的name相对应。
  • #_FILE['key']['name'] 可以获取上传的文件名。
  • #_FILE['key']['tmp_name']可以获取上传的文件保存的临时目录。

附录:move_uploaded_file(移动文件)
move_uploaded_file参数:
参数1:移动的文件
参数2:目标路径

php默认有上传文件大小的限制
我们只需要更改php.ini就可以修改基本配置

  • 设置文件最大上传限制(值的大小可以根据需求修改)

    file_uploads = On   ; 是否允许上传文件 On/Off 默认是On
    upload_max_filesize = 32M       ; 上传文件的最大限制
    post_max_size = 32M             ; 通过Post提交的最多数据
  • 考虑网络传输快慢,这里修改一些参数

    max_execution_time = 30000      ; 脚本最长的执行时间 单位为秒
    max_input_time = 600            ; 接收提交的数据的时间限制 单位为秒
    memory_limit = 1024M            ; 最大的内存消耗