Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
本文主要对一些NodeJS的基本概念做一个介绍。
模块的引入方式
在NodeJS中,可以通过require
命令,引入需要的模块,主要有以下三种方式:
- 引入NodeJS提供的内置模块,譬如:
http
,fs
var fs = require('fs');
- 引入第三包,譬如
http-server
(前提本地已安装了该模块)
var httpServer = require('http-server')
- 引入自己封装的模块,譬如
API.js
,需要特别注意的是:需要加./相对路径
,这区别于上面两种方式。
// ① API.js
function test() {
console.log('欢迎引入该模块');
}
module.exports.say = test; // 对外暴露test方法
// ② main.js
const API = require('./API.js');
API.say();
// ③ 执行命令 node main.js
Require模块的查找路径
这里主要是针对第三方依赖。在当前文件中引入第三方依赖时,它优先从当前目录的node_modules
中查找是否有该模块,若没有,往上一个目录查找,直至根目录。举例如下,有如下目录:
➜ node pwd
/Users/xushufeng/Desktop/node
➜ node ls -al
total 24
drwxr-xr-x 6 xushufeng staff 192 8 20 17:34 .
drwx------+ 14 xushufeng staff 448 8 20 14:42 ..
-rw-r--r-- 1 xushufeng staff 70 8 20 14:46 api.js
-rw-r--r-- 1 xushufeng staff 41 8 20 17:23 index.js
drwxr-xr-x 52 xushufeng staff 1664 8 20 17:34 node_modules
-rw-r--r-- 1 xushufeng staff 329 8 20 17:36 package.json
先从node目录下的node_modules
查找,若有则直接使用;若没有,则往上去Desktop目录下的node_modules
继续查找,直至根目录。
需要特别注意的是,模块路径的查找与全局安装的模块没有任何关系
,
因为全局安装的路径为:/usr/local/lib/node_modules/
,找不到这里。
NPM包管理
Node.js 的包管理器 npm,是全球最大的开源库生态系统。
通过NodeJs提供的包管理工具,可以很方便的使用第三方依赖。常用的npm命令有:
-
npm install -g <pkg>
: 全局安装,MAC系统下,安装路径为/usr/local/lib/node_modules/
,可以在任何地方使用。 -
npm install --save|--save-dev <pkg>
: 将依赖安装于当前目录中,package.json
文件中的dependencies | devDependencies
字段会添加一条该依赖的版本信息 -
npm install
: 安装package.json
文件中,dependencies
和devDependencies
中所有的依赖
另外,如果全局没有安装,又想使用项目中安装的依赖命令时(譬如http-server
), 可以使用如下方式:
./node_modules/http-server/bin/http-server
NPM Script
现如今,前端工程化越来越成为一种趋势,在GitHub上面的很多项目中,经常可以看到一个package.json
文件, 举例如下:
{
"name": "node",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"http-server": "^0.11.1"
},
"devDependencies": {
"http-server": "^0.11.1"
}
}
虽然第三方提供了很多方便的命令行供我们使用,但是每次都要输那么一长串命令,时间长了根本就记不住,这个时候,我们就可以往scripts
字段中,配置我们需要的命令。例如:
{
"scripts": {
"css:autoprefixer": "postcss -u autoprefixer -r dist/css/*",
"css:compress": "csso in.css --output out.css",
"js:lint": "eslint src/js",
"js:uglify": "mkdir -p dist/js && uglifyjs src/js/*.js -m -o dist/js/app.js",
"image:imagemin": "app=imagemin-cli npm run check; imagemin src/images dist/images -p",
"server": "browser-sync start --server --files 'dist/css/*.css, dist/js/*.js'",
"watch": "onchange 'src/js/*.js' -- npm run css:compress",
"start": "npm run server"
}
}
npm run css:autoprefixer
npm start
常用的第三方包
-
nrm
: 快速切换npm源
npm install -g nrm
nrm ls
nrm use taobao
nrm use npm
-
n
: 方便切换NodeJS版本