温馨提示: 通过nvm安装,若之前安装过node.js,得把之前安装过的node.js卸载掉
一、Node安装与卸载
1.1安装
(一)直接安装
(二)nvm方式安装
nvm
:node.js版本管理工具
Windows 操作系统的 nvm 下载地址:.
2.1第一步: 点击下载
2.2第二步: 解压后点击安装
2.3第三步: 自己在文件里创建个dev文件夹【目的:方便查找】,入下图安装
2.4第四步: node.js(镜像文件)、建立安装到dev里面,便于查找
2.5第五步: 查看是否成功状态
2.6第六步: 配置文件–打开刚刚的dev文件【若没有nodejs文件夹,请自行创建即可】
2.7第七步: 修改dev/nvm下的 settings.txt 文件
- root:nvm的安装位置(自动生成)
- path:指定的 nodejs 的快捷目录(自动生成)
- node_mirror:设置 下载 node 时的镜像
- npm_mirror:设置 下载 npm 时的镜像
例如:
root: E:\tools\dev\nvm
path: E:\tools\dev\nodejs
node_mirror: http://npm.taobao.org/mirrors/node/
npm_mirror: https://npm.taobao.org/mirrors/npm/
③输入nvm install 15开始安装:
④nvm use 15 // 使用指定版本
注意: 安装版本过高,可能会出问题
若出现无法安装到nodejs中,则直接安装到根目录下,配置环境变量即可。
nvm设置使用的node版本出错时,可尝试使用以管理员运行命令提示符进行设置
(三)nvm常用命令
nvm install
:node 安装指令- nvm install 0.0.1 :指定安装的版本
- nvm install 9 :指定大版本,会安装这个大版本的最新版本
- nvm install latest : 安装最新版本
- nvm install 0.0.1 :指定安装的版本
nvm list
:查看本地已安装的node版本nvm use
:- nvm use 0.0.1 :启用已安装的版本
- uninstall 版本:卸载
(四)cnpm下载
npm install -g cnpm --registry=https://registry.npm.taobao.org
1.2卸载
(一)在控制面板-程序-程序和功能中卸载
确保node.js没有在后台运行的情况下,进行卸载,可做重启操作后,在到控制面板中找到node.js进行卸载
(二)卸载后 到文件夹中进行进一步的删除
C:\Program Files (x86)\Nodejs
C:\Program Files\Nodejs
C:\Users\xxx\AppData\Roaming\npm
C:\Users\xxx\AppData\Roaming\npm-cache
删除上述的几个文件夹 Administrator是我的用户名 每个人可能不一样
(三)检查环境变量中Path中有没有[有就删]
(四)最后 重启一下电脑
二、commonjs规范
2.1、commonjs
map:
- [commonjs模块化规范特点](#commonjs模块化规范特点)
- [module对象](#module对象)
- [module.exports](#module.exports)
- [exports变量](#exports变量)
- [require](#require)
- [commonjs的模块加载机制]
2.2、common.js模块化规范特点
(一)所有代码都运行在模块作用域,不会污染全局作用域(每个文件就是一个模块,有自己的作用域,在一个文件里面定义的变量、函数、类都是私有的,对其他文件不可见)
(二)模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果,要想让模块再次运行,必须清除缓存;
(三)模块加载的顺序,按照其在代码中出现的顺序;
2.3、module对象
Node内部提供一个 Module
构建函数。所有模块都是 Module
的实例。
每个模块内部,都有一个module对象,代表当前模块。它有以下属性。
module.id
模块的识别符,通常是带有绝对路径的模块文件名。module.filename
模块的文件名,带有绝对路径。module.loaded
返回一个布尔值,表示模块是否已经完成加载。module.parent
返回一个对象,表示调用该模块的模块。module.children
返回一个数组,表示该模块要用到的其他模块。module.exports
表示模块对外输出的值。
通过 exports
和 module.exports
向外暴露成员。
2.4、module.exports
module.exports
属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取 module.exports
变量。
// 导出 test1.js
module.exports = 123
// 导入
let a = require('./test1')
console.log('a -->', a); // 123
2.5、exports变量
// 导出 test1.js
module.exports = 123
// 导入
let a = require('./test1')
console.log('a -->', a); // 123
为了方便,Node为每个模块提供一个exports变量,指向module.exports。
// 导出 test1.js
exports.xxx = 'hello'
// 导入
let a = require('./test1')
console.log( a.xxx ) // hello
// 导出 test1.js
let ee = {
fn: function(){
console.log('err')
}
};
exports.xxx = ee
// 导入
let rr = require('./test1')
console.log(rr) // {xxx: {fn: function(){}}}
console.log(rr.xxx.fn()) // 'err'
2.6、案例理解
正常情况下:
//导出:
let n =123;
function fn(){
console.log(666)
}
let obj = {
name: 'hello',
age: 18,
fn(){
console.log(888);
return 'ok'
}
}
module.exports.fn = fn;
module.exports.num = n;
module.exports.obj = obj;
function init(){
console.log(1123);
}
exports.init = init;
//导入
let fn = require('./module.js');
console.log('fn----->',fn);
结果
非正常情况下:
//导出
let n =123;
function fn(){
console.log(666)
}
let obj = {
name: 'hello',
age: 18,
fn(){
console.log(888);
return 'ok'
}
}
module.exports.fn = fn;
module.exports.num = n;
module.exports.obj = obj;
function init(){
console.log(1123);
}
exports.init = init;
//直接给module赋值的话,就相当于切断了指向obj的线,将会直接把值暴露出来
module.exports = init;
console.log('exports---->',typeof(exports));
//导入
let fn = require('./module.js');
console.log('fn----->',fn);
结果:
因此,总结如下:
2.7、require
Node 使用 CommonJS 模块规范,内置的 require
命令用于加载模块文件。
require命令的基本功能是,读入并执行一个 JavaScript 文件,然后返回该模块的 module.exports
对象。如果没有发现指定模块,会报错。
require 参数的几种情况
- require(‘./xxx’) : 加载本地模块
- require(‘/xxx/yyy/zzz/aaa’) : 加载绝对路径的模块
- require(‘xxx’) : 加载官方模块 或 第三方包
弊端
let fn =() => {
console.log(666);
}
let fn1 =() => {
console.log(6661);
}
module.exports = fn1;
module.exports = fn;
let fn = require('./module.js');
console.log('fn----->',fn);
结果只会是一个函数
三、Path
3.1目录、文件、扩展名
- path.dirname(path) :返回
path
的目录名,类似 Unix 的dirname
命令 - path.basename(path[,ext]) :返回
path
的最后一部分,类似 Unix 的basename
命令 - path.extname(path) :返回
path
的扩展名
console.log(path.dirname('/foo/bare/styd/query'));//返回当前/foo/bare/styd
console.log(path.basename('/foo/bare/styd/query'));//得到query
console.log(path.extname('aaaa/bbbb/cccc/dddd/index.html'));//得到.html
3.2路径规范化和解析、拼接
- path.normalize(path) :规范化路径
- path.resolve([…path]) :将路径或路径片段的序列解析为 绝对路径 如果没有传入
path
片段,则path.resolve()
将返回当前工作目录的绝对路径 - path.join([…path]) :使用平台特定的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径
- path.parse(path) :返回一个对象,其属性表示
path
的重要元素。 尾部的目录分隔符将被忽略 - path.format(path) :从对象返回路径字符串。 与 path.parse() 相反。
- 如果提供了
pathObject.dir
,则忽略pathObject.root
- 如果
pathObject.base
存在,则忽略pathObject.ext
和pathObject.name
- 如果提供了
/* {
root: '/',
dir: '/foo/bare/styd',
base: 'query.txt',
ext: '.txt',
name: 'query'
} */
console.log(path.parse('/foo/bare/styd/query.txt'));//返回上述一个对象
let pp = {
root: '/',
dir: '/foo/bare/styd',
base: 'query.txt',
ext: '.txt',
name: 'query'
}
console.log("format==",path.format(pp));//format== /foo/bare/styd\query.txt
console.log(path.relative('aaa','bbb','ccc'));//..\bbb
console.log(path.resolve('/aaa','bar','bb/ffb','ccc','..'));//D:\aaa\bar\bb\ffb
console.log(path.join