为了研究VOID的代码,学习一波Typecho的主题,大致翻阅了nodejs,JavaScript,jQuery的相关语法以及基础使用,VOID的主题还使用了gulp来打包代码,所以也大概了解一下Gulp。再次记录一下一些遇到的问题以及解答。

遇到的问题

  1. Node.js全局安装和本地安装有什么区别?
    全局安装后可以供命令行(command line)使用,用户可以在命令行中直接运行该组件包支持的命令;
    本地安装后可以直接通过require()的方式引入项目中node_modules目录下的模块,如下示例,本地安装后直接在gulpfile.js中require('gulp')。
  2. 全局安装了gulp为啥还要本地安装?
    这是gulp为了版本和依赖的控制。全局安装gulp是为了执行gulp任务,即能让命令行运行gulp相关命令,本地安装gulp是为了调用gulp插件的功能。方便你在不同的项目中使用不同版本的 gulp,如果仅在全局装一个 gulp 所有项目就只能使用同一个版本的 gulp 了。

Node.js命令记录:

npm查看与帮助:
npm -v #查看版本
npm --version #查看版本
npm help #查看帮助
npm help folders #查看npm使用的所有文件夹
npm bin
npm安装模块:
npm install <name>
npm install  <name> @2.5.0  #安装express指定版本
npm i nstall -g <name> #全局安装,-g等效于-global
npm install <name>@>=0.2.0<0.2.9 #安装这个范围的版本
npm install <name> --save #安装的同时,将信息写入package.json项目路径中的dependencies
npm install <name> --save-dev #安装的同时,将信息写入package.json项目路径中devDependencies
npm install <name> --save-optional #参数安装的模块写到package.json中的opntionalDependencies中
npm install <name>@<tag> #安装指定tag版本,如latest
npm install <name> -force #强制拉取远程资源,即使本地已经安装这个模块
npm install <tarball> #安装本地模块文件, 例如npm install ./package.tgz 
npm install <tarball url> #安装指定URL模块文件, 例如npm install  https://github.com/indexzero/forever/tarball/v0.5.6
查看node模块:
npm show  <name> #显示express信息
npm view <name>  dependencies #查看包依赖关系
npm view  <name>  repository.url #查看包的源文件地址
npm view  <name>  engines #查看包所依赖的node版本
npm list #模块列表
npm list parseable=true #以目录形式展现当前安装的所有node包
npm outdated #列出过时的包
npm search [search terms] #查找模块 search 可以替换为s或se
操作node模块:
npm update  <name>  #更新包
npm remove <name> #移除包,remove等效于rm、r两个命令
npm uninstall  <name> (-g) #卸载包,uninstall 等效于un命令,不会删除package.json内dependencies对应系项
npm update #更新
npm rebuild  <name> #更改包内容后重建
执行node脚本:
npm start [<name>] #运行package的start脚本,该脚本写在package.json文件script的start字段中
npm stop [<name>]
npm test [<name>]
创建工程:
npm init #引导创建一个package.json,包括版本、名称、作者等信息
npm search #packageName 发布一个包前,验证包是否存在
npm help json #以默认的方式打开一个网页,如果更改了默认打开程序则可能不会以网页的形式打开。
发布模块:
npm publish <tarball> #经过gzip压缩并归档的一个URL或文件路径,该压缩包包含单个目录,且该目录内包含package.json
npm publish <folder> #包含package.json的目录
Node命令:
node -v  #查看node安装版本
node --version #查看node安装版本
node cli.js install npm -gf  #安装npm最新版
node cli.js install npm@1.0.105 gf  #安装npm指定版本
#ctrl+c两次即退出node
node  #进入 >   即命令行状态
.help #查 看帮 助
.exit #退出
require("express") #命令行状态下检查express是否安装正确  
npm配置npm config set <key> <value> [-global]:
npm root #查看当前包的安装路径
npm root -g #查看全局的包的安装路径
npm config ls -l #查看当前的目录设置
npm ls #查看安装的模块及依赖
npm ls -g #查看全局安装的模块及依赖
npm get global #查看安装模式
npm set gobal=true #设定全局安装模式
npm cache clean //清理缓存
npm config delete <key> #删除配置
npm config edit #在编辑器中打开npm配置文件
#在nodejs下新建node_global文件夹和node_cache文件夹,设置全局模块及cache路径
npm config set prefix "E:\nodejs\node_global"  #设置全局模块安装地址
npm config set cache "E:\nodejs\node_cache" #设置cache路径
#删除C:\Program Files\nodejs\node_modules\npm #目录下的npmrc文件
#在.npmrc文件中最后一行写入registry = http://registry.cnpmjs.org
npm config set registry https: //registry.npm.taobao.org  #设置npm库
npm config get registry #查看npm库地址
npm config set proxy http://10177495:zydSuccess2015@proxymsn.zte.com.cn:80   #设置代理地址 
npm config get proxy #查看 代理地址  

package.json文件

每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。

package.json 文件至少要有两部分内容:

  1. “name”

    全部小写,没有空格,可以使用下划线或者横线

  2. “version”

    • x.x.x 的格式
    • 符合“语义化版本规则”
{
    "name":"Hello World",
    "version":"0.0.1",
    "author":"张三",
    "description":"第一个node.js程序",
    "keywords":[
        "node.js",
        "javascript"
    ],
    "repository":{
        "type":"git",
        "url":"https://path/to/url"
    },
    "license":"MIT",
    "engines":{
        "node":"0.10.x"
    },
    "bugs":{
        "url":"http://path/to/bug",
        "email":"bug@example.com"
    },
    "contributors":[
        {
            "name":"李四",
            "email":"lisi@example.com"
        }
    ],
    "scripts":{
        "preinstall":"echo here it comes!",
        "postinstall":"echo there it goes!",
        "start":"node index.js",
        "test":"tap test/*.js"
    },
    "dependencies":{
        "express":"latest",
        "mongoose":"~3.8.3",
        "handlebars-runtime":"~1.0.12",
        "express3-handlebars":"~0.5.0",
        "MD5":"~1.2.0"
    },
    "devDependencies":{
        "bower":"~1.2.8",
        "grunt":"~0.4.1",
        "grunt-contrib-concat":"~0.3.0",
        "grunt-contrib-jshint":"~0.7.2",
        "grunt-contrib-uglify":"~0.2.7",
        "grunt-contrib-clean":"~0.5.0",
        "browserify":"2.36.1",
        "grunt-browserify":"~1.3.0",
        "gulp":"^4.0.0",
        "gulp-autoprefixer":"^6.0.0",
        "gulp-clean-css":"^4.0.0",
        "gulp-concat":"^2.6.1",
        "gulp-rev":"^9.0.0",
        "gulp-rev-collector":"^1.3.1",
        "gulp-sass":"^4.0.2",
        "gulp-uglify":"^3.0.1"
    }
}

其他必要字段说明:

  1. scripts字段
    scripts指定了运行脚本命令的npm命令行缩写,比如start指定了运行npm run start时,所要执行的命令。
    上面的设置指定了npm run preinstallnpm run postinstallnpm run startnpm run test时,所要执行的命令。
  2. dependencies字段,devDependencies字段
    dependencies字段指定了项目运行所依赖的模块,devDependencies指定项目开发所需要的模块。
    它们都指向一个对象。该对象的各个成员,分别由模块名和对应的版本要求组成,表示依赖的模块及其版本范围。

    • 指定版本:比如1.2.2,遵循“大版本.次要版本.小版本”的格式规定,安装时只安装指定版本。
    • 波浪号(tilde)+指定版本:比如~1.2.2,表示安装1.2.x的最新版本(不低于1.2.2),但是不安装1.3.x,也就是说安装时不改变大版本号和次要版本号。
    • 插入号(caret)+指定版本:比如ˆ1.2.2,表示安装1.x.x的最新版本(不低于1.2.2),但是不安装2.x.x,也就是说安装时不改变大版本号。需要注意的是,如果大版本号为0,则插入号的行为与波浪号相同,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容。
    • latest:安装最新版本。
  3. 其他

    • description:描述信息,有助于搜索
    • main: 入口文件,一般都是 index.js
    • scripts:支持的脚本,默认是一个空的 test
    • keywords:关键字,有助于在人们使用 npm search 搜索时发现你的项目
    • author:作者信息
    • license:默认是 MIT
    • bugs:当前项目的一些错误信息,如果有的话
    • contributors:贡献者

package.json文件可以手工编写,也可以使用npm init命令自动生成。

$ npm init

这个命令采用互动方式,要求用户回答一些问题,然后在当前目录生成一个基本的package.json文件。所有问题之中,只有项目名称(name)和项目版本(version)是必填的,其他都是选填的。

如果一个模块不在package.json文件之中,可以单独安装这个模块,并使用相应的参数,将其写入package.json文件之中。

$ npm install express --save
$ npm install express --save-dev