《Node.js》

一、资料

1、官网资料

Node.js官网
npm官网
npm中文网

2、参考资料

npm发布全局包

二、简介

1、Node.js 是一个开源与跨平台的 JavaScript 运行时环境。
2、Node.js 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核)。
3、Node.js 中使用require(),而在浏览器中则使用 import

三、使用

1、基本操作

// 安装Node.js
brew install node
// node版本
node -v
// 运行
node [name].js
// 命令行退出
Ctrl+C 

2、process模块

Node.js 的 process 核心模块提供了 env 属性,该属性承载了在启动进程时设置的所有环境变量。process 不需要 require,它是自动可用的

// 使用 Node.js 中内置的 process 对象获取参数,第一个参数是 node 命令的完整路径,第二个参数是正被执行的文件的完整路径。
node [name].js joe
node [name].js name=joe
// 循环迭代所有的参数
process.argv.forEach((val, index) => {
  console.log(`${index}: ${val}`)
})
// 创建一个排除了前两个参数的新数组来仅获取其他的参数
const args = process.argv.slice(2)
// 编程退出
process.exit()
// 环境变量
process.env.NODE_ENV // "development"

3、console模块

该模块提供了大量非常有用的与命令行交互的方法

// 输出
console.log()
// e.g.
const x = 'x'
const y = 'y'
console.log(x, y)
// 格式化输出
// %s 会格式化变量为字符串
// %d 会格式化变量为数字
// %i 会格式化变量为其整数部分
// %o 会格式化变量为对象
// e.g.
console.log('%o', Number)
console.log('我的%s已经%d岁', '猫', 2)
// 清空控制台
console.clear()
// count 方法会对打印的字符串的次数进行计数,并在其旁边打印计数
console.count()
// 打印堆栈踪迹
console.trace() 
// e.g.
const function2 = () => console.trace()
const function1 = () => function2()
function1()
// 计算耗时
time() 
timeEnd()

4、readline模块

Node.js 提供了 readline模块来执行以下操作:每次一行地从可读流获取输入

const readline = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
})

readline.question(`你叫什么名字?`, name => {
  console.log(`你好 ${name}!`)
  readline.close()
})

四、模块

Node.js 模块是一种可以发布到 npm 的包。

1、package.json

文件格式:

package.json
|- name // 必填;全部小写;没有空格;可用-或者_;
|- version // 必填;格式x.x.x
|- description // 如果为空,使用README文件第一行代替;有助于找到package
|- main // 入口文件字段,默认值 index.js
|- scripts 
|- author 
|- license 
|- dependencies // 生产依赖
|- devDependencies // 开发依赖

For example:
{
  "name": "my-awesome-package",
  "version": "1.0.0"
}

2、创建模块

// npm初始化,创建package.json
// 进入命令行参数输入
npm init
// 创建默认版本
npm init -y
npm init --yes

3、exports

1、Node.js 具有内置的模块系统,Node.js 文件可以导入其他 Node.js 文件公开的功能。
2、默认情况下,文件中定义的任何其他对象或变量都是私有的,不会公开给外界。在文件中,必须先公开功能,然后其他文件才能将其导入。
3、当将对象或函数赋值为新的 exports 属性时,这就是要被公开的内容,因此,可以将其导入应用程序的其他部分或其他应用程序中。
4、第一种方式是将对象赋值给 module.exports(这是模块系统提供的对象),这会使文件只导出该对象。第二种方式是将要导出的对象添加为 exports 的属性。这种方式可以导出多个对象、函数或数据。

// 导入存在于当前文件夹中的 library.js 文件中公开的功能
const library = require('./library')

//  将对象赋值给 module.exports
const car = {
  brand: 'Ford',
  model: 'Fiesta'
}
module.exports = car
//在另一个文件中
const car = require('./car')

// 将要导出的对象添加为 exports 的属性
exports.car = {
  brand: 'Ford',
  model: 'Fiesta'
}
//在另一个文件中
const car = require('./items').car

五、npm

1、npm 是 Node.js 标准的软件包管理器,可以管理项目依赖的下载。
2、Yarn 是 npm 的一个替代选择。
3、本地和全局的软件包之间的主要区别是:本地的软件包安装在运行 npm install <package-name> 的目录中,并且放置在此目录下的 node_modules 文件夹中。全局的软件包 放在系统中的单独位置(确切的位置取决于设置),无论在何处运行 npm install -g <package-name>

// npm版本
npm -v
// 安装npm最新版本
npm install npm@latest -g.
// 全局安装的位置
npm root -g
-------------------------------------------------------------------
// npm源
// 输出npm源
npm config get registry
// 改变npm源
npm config set registry [URL]
npm config set registry https://registry.npmjs.org/
npm config set registry http://registry.npm.taobao.org
-------------------------------------------------------------------
// npm安装
// 安装所有依赖。如果项目具有 package.json 文件,则会在 package.json 文件中查找所约定的语义化版本规则,然后安装符合此规则的最新版本,通过运行,会在 node_modules 文件夹(如果尚不存在则会创建)中安装项目所需的所有依赖
npm install
// 本地安装,命令执行之后将会在当前的目录下创建 node_modules 目录(如果不存在的话),然后将下载的包保存到这个目录下
npm install <package>
// --save 安装并添加条目到 package.json 文件的 dependencies
// --save-dev 安装并添加条目到 package.json 文件的 devDependencies
// devDependencies 通常是开发的工具(例如测试的库),而 dependencies 则是与生产环境中的应用程序相关
npm install <package> [--save/--save-dev]
// 全局安装
npm install <package> -g
-------------------------------------------------------------------
// npm更新
// 列出待更新包 [全局]
npm outdated [-g]
// 更新所有软件包 [全局]
npm update [-g]
// 更新单个软件包 [全局]
npm update <package> [-g]
-------------------------------------------------------------------
// npm卸载
//  删除包并从 package.json 文件中删除依赖
// 从项目的根文件夹(包含 node_modules 文件夹的文件夹)中运行
npm uninstall <package> [--save/--save-dev]
// 删除 node_modules 目录下面的包 [全局]
npm uninstall <package> [-g]
-------------------------------------------------------------------
// 查看所有已安装的 npm 软件包(包括它们的依赖包)的最新版本 [全局]
npm list [-g]
// 查看所有已安装的 npm 软件包,仅获取顶层 [全局]
npm list --depth=0 [-g]
// 通过指定名称来获取特定软件包的版本
npm list <package>
-------------------------------------------------------------------
// 查看软件包在 npm 仓库上最新的可用版本
npm view <package> version
// 列出软件包所有的以前的版本
npm view <package> versions
// 使用 @ 语法来安装 npm 软件包的旧版本 [全局]
npm install <package>@<version> [-g]
-------------------------------------------------------------------
// 运行任务
npm run <task>
-------------------------------------------------------------------
// npm发布
// 登录之后才可以进行发布。
// npm账户
npm adduser
npm login
npm whoami
// npm预发布,可以执行命令行
npm link
// npm解除预发布,可以执行命令行
npm unlink
// npm发布,注意切换npm源,taobao源无发布权限,https://npmjs.com/package
npm publish
// 解除发布
npm unpublish <package> --force

六、全局安装包

1、nrm

npm install nrm -g
// 列出所有源和指令
nrm ls
// 切换地址
nrm use [registry_name]
// 测试速度
nrm test [registry_name]

七、库

resolver 是一个库(library),用于帮助找到模块的绝对路径。

1、lodash

// 把软件包安装到本地的 node_modules 文件夹中
npm install lodash
// 要在代码中使用,只需使用 require 将其导入到程序中
const _ = require('lodash')

2、minimist

处理参数

node app.js --name=joe
const args = require('minimist')(process.argv.slice(2))
args['name'] //joe

3、chalk

// 安装
npm install  --save chalk
// 使用
const chalk = require('chalk')
console.log(chalk.yellow('Hello'))

4、progress

// 安装
npm install --save progress
// 使用
const ProgressBar = require('progress')
const bar = new ProgressBar(':bar', { total: 10 })
const timer = setInterval(() => {
  bar.tick()
  if (bar.complete) {
    clearInterval(timer)
  }
}, 100)

5、inquirer

// 安装
npm install --save inquirer
// 使用
const inquirer = require('inquirer')
var questions = [
  {
    type: 'input',
    name: 'name',
    message: "你叫什么名字?"
  }
]
inquirer.prompt(questions).then(answers => {
  console.log(`你好 ${answers['name']}!`)
})

6、Commander

Commander GitHub
Commander基本使用

7、child_process

https://www.cnblogs.com/justyouadmin/p/11395839.html
https://blog.csdn.net/bjzhaoxiao/article/details/80896611?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-2.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-baidujs-2.nonecase

八、创建npm包

1、创建目录,npm初始化,生成默认的package.json文件

mkdir jdpay
cd jdpay
npm init -y

2、添加index.js入口文件

// index.js
console.log("Hello, JDPay");

// 执行index.js,本地测试
node index.js

3、添加jdpay.js,在index.js导入

// jdpay.js
module.exports = {
    pay: function () {
        console.log("JDPay");
    }     
 }; 

// index.js
let jdpay = require('./bin/jdpay.js');
jdpay.pay();

4、修改index.js,预发布

npm root -g
npm link

5、创建工程,安装测试

npm link <package>

6、发布

npm publish

九、创建CLI

1、创建目录,npm初始化

mkdir jdpay-cli
cd jdpay-cli
npm init -y

2、添加bin文件夹和jdpay.js文件

mkdir bin
cd bin
cat > jdpay.js
console.log("JDPay");
^C

3、在package.json里配置 bin

// package.json
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
"bin": {
    "pay": "./bin/jdpay.js"
 },

4、导入commander

// 安装
npm install commander --save

// jdpay.js
#!/usr/bin/env node
const program = require('commander');
program
    .version(require('../package').version) // 设置版本
    .option('-p, --port [port]', 'Input port !') // 自定义形参[port]
    .parse(process.argv); // 参数数组
console.log(program.port); // 使用自定义的port参数

// node jdpay.js -p test
test

5、预发布、命令测试

npm link

// jdpay-cli
jdpay -p test
test

6、npm发布

npm publish
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容