2018.8.9
基础
1 | ## 配置信息 |
node多版本控制
mac/lunix: nvm
windows: nvm-windows
n
windows nvm use xxx 报错:node vv16.15.0 (64-bit) is not installed or cannot be found.
解决:cmd用管理员身份打开执行。
PS: 安装的时候会指定NVM_SYMLINK变量(nodejs),use的时候会创建一个软连接。
<!–
卸载nodejs不重要。use 的时候,会覆盖掉吧。
但是nrm 没有删除掉,install的时候报错。所以去用户目录下把.nrmrc 文件删掉了。
把之前重复设置的nodejs 环境变量也删掉了;现在是NVM_SYMLINK变量,会添加到环境变量PATH中。
原始.npmrc 配置1
2
3
4electron_mirror=https://npm.taobao.org/mirrors/electron/
registry=https://registry.npmjs.org/
//registry.npmjs.org/:_authToken=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
home=https://npm.taobao.org
–>
nvm 配置在nvm安装目录下settings.txt。可以设置源。1
2
3
4
5root: D:\Program Files\nvm
path: D:\Program Files\nodejs
node_mirror: https://npm.taobao.org/mirrors/node/
npm_mirror: https://npm.taobao.org/mirrors/npm/
改变全局模块/缓存路劲
# 安装npm cnpm踩坑记录
## 3. 改变原有的环境变量(配置npm的全局模块的存放路径以及cache的路径)
(1)先在C:\Program Files\nodejs目录下新建”global”和”cache”两个文件夹
(2)输入以下命令改变npm配置
npm config set prefix “C:\Program Files\nodejs\global”
npm config set cache “C:\Program Files\nodejs\cache”
## 4.配置环境变量
(1)我的电脑右键点击属性进入该页面—点击高级系统设置—点击环境变量进入该页面
(2)修改用户变量PATH:把”C:\Program Files\nodejs\global”加到后面,用分号隔开。
(3)新增系统变量NODE_PATH:设置成“C:\Program Files\nodejs\node_global\node_modules”。
tip:由于前面已经更改了原有的环境变量,所以安装cnmp时会自己安装到C:\Program Files\nodejs\global\node_modules目录下面,所以cnpm的环境变量也许要更改(如下步骤很重要)
(4)修改系统变量path:把“C:\Program Files\nodejs\global\node_modules\cnpm“加到后面
## 5.安装cnmp
安装命令:npm install -g cnpm –registry=https://registry.npm.taobao.org
## 6.cmd检测是否安装成功(cnpm -v),如下就算成功
设置cnpm
# npm的设置cnpm
淘宝 npm 地址: http://npm.taobao.org/
如何使用
有很多方法来配置npm的registry地址,下面根据不同情境列出几种比较常用的方法。以淘宝npm镜像安装express举例:
## 1.临时使用
npm –registry https://registry.npm.taobao.org install express
## 2.持久使用
npm config set registry https://registry.npm.taobao.org
// 配置后可通过下面方式来验证是否成功
npm config get registry
// 或
npm info express
## 3.通过cnpm使用
npm install -g cnpm –registry=https://registry.npm.taobao.org
// 使用
cnpm install express
## 4.关闭npm的https
npm config set strict-ssl false
设置镜像
这个也是网上搜的,亲自试过,非常好用!
镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在):
## 1.通过config命令
npm config set registry https://registry.npm.taobao.org
npm info underscore (如果上面配置正确这个命令会有字符串response)
## 2.命令行指定
npm –registry https://registry.npm.taobao.org info underscore
## 3.编辑 ~/.npmrc 加入下面内容
registry = https://registry.npm.taobao.org
搜索镜像: https://npm.taobao.org
建立或使用镜像,参考: https://github.com/cnpm/cnpmjs.org
nrm
nrm(npm registry manager )是npm的镜像源管理工具,有时候国外资源太慢,使用这个就可以快速地在 npm 源间切换npm install -g nrm1
2
3nrm ls
nrm add xx https://registry.x.com
nrm use xx
# npm 安装 electron 超时
在用户目录的 .npmrc 文件里添加一行
electron_mirror=https://npm.taobao.org/mirrors/electron/
指定 Electron 二进制文件的国内镜像(上面路径里最后一个正斜杠 “/“ 别丢了)。
为Npm设代理
为npm更换镜像后,我在公司安装npm包还是链接超时。后来在同事的提醒下,知道公司所有的网络链接都要通过公司代理服务器的。所以尝试着为npm设置了下proxy,设置方法如下:
第一个是http,第二个是https
npm config set proxy http://proxy.company.com
npm config set https-proxy http://proxy.company.com
上面proxy代理地址可根据你公司电脑ie里默认设置的代理服务器来填写。如ie里没有设置代理服务器,那么就需要知道公司的代理服务器地址。
通过为npm设置公司代理服务器的方式,npm终于能顺利连接了。
NPM查看包的版本信息
查看npmjs服务器上的包的版本信息
npm view pkg version 查看服务器上包pkg的最新的版本信息
npm view gulp version # 4.0.0
npm view pgk versions 查看npmjs服务器上包pkg的所有的版本信息
npm view gulp versions
npm info pkg 查看npmjs服务器上包pkg的最新的版本信息,和npm view pkg version的功能类似,但比npm view pkg version提供的信息更丰富
npm info gulp查看本地安装包的版本信息
npm ls pkg 查看某个项目下包pkg的版本信息,注意该命令需要在某个项目下执行
npm ls webpack
webapp_backend@1.0.0 /本地的项目路径
└── webpack@3.12.0
npm ls pkg -g 查看本地全局安装的pkg版本
npm ls webpack -g
/Users/mac/.nvm/versions/node/v8.8.0/lib
└── webpack@4.29.6
版本号
#31 npm 版本号
npm版本号遵循semver规范。版本号格式为major.minor.patch。其中major、minor、patch必须是非0的开头的非负数。
此外,版本号还可以带上预发布和build metadata。
版本号的扩展
#### 预发布
在patch后加上”-“和一串由”.”连接的标识符。格式为major.minor.patch-{identifier}.{identifier}.{identifier}。
identifier必须是数字、大小写字母或连字符组成的非空字符串。比如:1.0.3-alpha.1
#### build metadata
在patch或预发布后面加上”+”和一串由”.”连接的标识符。格式为major.minor.patch+{identifier}.{identifier}.{identifier}或者 major.minor.patch{pre-release}+{identifier}.{identifier}.{identifier}。如:1.0.3-alpha.1+001,1.0.0-beta+exp.sha.5114f85
版本号大小比较
版本号大小比较是从左到右依次比较major、minor、patch、pre-release。 build-metadata对优先级无影响 。预发布版本优先级低于正式版本
安装semver工具测一测npm install --save semver
semver规范
版本运算符
版本运算符指定了一定范围的版本。
主要有~、^、-、<、<=、>、>=、=版本运算符。
~ 版本号 —– 指定主版本号或者次版本号相同
^ 版本号 — 第一个非零 版本号相同
<!–
兼容某个版本
版本号中最左边的非0数字的右侧可以任意
如果缺少某个版本号,则这个版本号的位置可以任意 如:^1.1.2 ,表示>=1.1.2 <2.0.0,可以是1.1.2,1.1.3,…,1.1.n,1.2.n,…,1.n.n
如:^0.2.3 ,表示>=0.2.3 <0.3.0,可以是0.2.3,0.2.4,…,0.2.n
如:^0.0,表示 >=0.0.0 <0.1.0,可以是0.0.0,0.0.1,…,0.0.n
–>
~ vs ^: 同一个版本号,^ 能匹配的范围大些,更加激进。
- 指定精确范围
分组 ||: npm i vue@"^0.7 || ~2" # 安装 2.6.10
x的位置表示任意版本
标识符 任意版本
“”(空字符串) 匹配任何版本,和一样
版本号变更规则
- 版本号只升不降,不得在数字前加0,比如 2.01.2 不允许的;
- 0.y.z,处于开发阶段的版本;
- 第一个正式版版本往往命名为 1.0.0;
- 先行版本必须在补丁版本之后添加,比如 2.3.7-0,0表示先行版本,和补丁版本用-分隔;
- 版本的比较依次比较主版本→次版本→补丁版本→先行版本,直到第一个能得出比较结果为止;
- 不小心把一个不兼容的改版当成了次版本号发行了该怎么办?一旦发现自己破坏了语义化版本控制的规范,就要修正这个问题,并发行一个新的次版本号来更正这个问题并且恢复向下兼容。即使是这种情况,也不能去修改已发行的版本。
npm version
git 和 npm version 结合
手动更改版本号
执行 npm version <version> -m 'xx %s xx'改变npm版本的同时,会执行一次 git commt -m ‘xx %s xx’并用版本号打一个tag,%s 会替换成版本号,前提是版本库是干净的(clean)。
自动更新版本
在 .git/hooks目录内,新建post-commit,输入以下内容:1
2
3
4
5
6
7
COMMIT_MSG="$(git log --pretty=format:"%s" -1 head)"
echo "$COMMIT_MSG" | grep -q "^[0-9]"
if [ $? -ne 0 ];then
# 自动修改 patch
echo $(npm version patch)
fi
tag
常用的版本号标签有latest(默认),alpha(内测), beta (公测), next(下一个), rc( 候选), experimental(实验)。
给版本号添加标签的方式有两种。一种是在发布时指定标签,如npm publish --tag alpha。另一个种是发布后执行命令npm dist-tag add your-npm-package@1.0.2-1 alpha。
一般不要通过npm unpublsh -f 删除发布的包
可以通过设置tag的方式去及时更新
npm tag
发布测试包,不希望检测更新,或避免用户安装测试包。
不小心把测试版发布成了正式版,我该怎么办?只能跑路了吗?
version:
发布到npm后,每一个版本号都对应了其资源文件,而且是不可修改的。npm中的版本号类似于git中的tag。
tag:
一般情况下,我们可以不指定tag,这时默认就会用latest这个tag,所有发布或者安装都是最新的正式版。
而指定tag之后,我们可以在这个tag上发布一个更新的版本,用户安装的时候如果也指定这个tag,则会安装这个tag下的最新版。
1 | # 查看当前的tag和对应的version。 |
npm发包
发包时机脚本
可以通过设置prepublish在发布前执行脚本
对于以下脚本,npm 支持 package.json 文件的“scripts”属性:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18prepublish:在包打包和发布之前运行,以及在npm install没有任何参数的本地运行。(见下文)
prepare:在打包和发布包之前运行,在npm install没有任何参数的本地运行(见下文)。这是在之后运行prepublish,但是之前prepublishOnly。
prepublishOnly:在准备和包装之前运行,仅打开npm publish。(见下文。)
prepack:前运行压缩包包装(上npm pack,npm publish并安装git的依赖时)
postpack:在生成tarball之后运行并移动到其最终目标。
publish,postpublish:发布包后运行。
preinstall:在安装软件包之前运行
install,postinstall:安装软件包后运行。
preuninstall,uninstall:在卸载软件包之前运行。
postuninstall:在卸载软件包后运行。
preversion:在碰撞包版本之前运行。
version:运行AFTER碰撞包版本,但提交之前。
postversion:运行AFTER碰撞包版本,然后提交。
pretest,test,posttest:由npm test命令运行。
prestop,stop,poststop:由npm stop命令运行。
prestart,start,poststart:由npm start命令运行。
prerestart,restart,postrestart:按npm restart命令运行。注意:npm restart如果没有restart提供脚本,将运行停止和启动脚本。
preshrinkwrap,shrinkwrap,postshrinkwrap:由npm shrinkwrap命令运行。
此外,可以通过运行执行任意脚本npm run-script <stage>。前置和后名称匹配的命令将这些运行以及(例如premyscript,myscript, postmyscript)。可以运行依赖项的脚本npm explore <pkg> -- npm run <stage>。
忽略文件
方法一:使用 .gitignore 设置忽略哪些文件
方法二:使用 .npmignore设置忽略哪些文件
.npmignore的写法跟.gitignore 的规则完全一样。
若同时使用了.npmignore和.gitignore,只有.npmignore会生效,优先级比较高。
方法三:使用package.json的files字段选择发布哪些文件
直接在package.json中files字段设置发布哪些文件或目录。
这个优先级高于.npmignore和.gitignore。
1 | # 默认被忽略: |
发布版本
npm version
3.1 发布稳定版本
更新版本号共有以下选项(major | minor | patch | premajor | preminor | prepatch | prerelease) ,注意项目的git status 必须是clear,才能使用这些命令。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# major 主版本号,并且不向下兼容 1.0.0 -> 2.0.0
$ npm version major
# minor 次版本号,有新功能且向下兼容 1.0.0 -> 1.1.0
$ npm version minor
# patch 修订号,修复一些问题、优化等 1.0.0 -> 1.0.1
$ npm version patch
# premajor 预备主版本 1.0.0 -> 2.0.0-0
$ npm version premajor
# preminor 预备次版本 1.0.0 -> 1.1.0-0
$ npm version preminor
# prepatch 预备修订号版本 1.0.0 -> 1.0.1-0
$ npm version prepatch
# prerelease 预发布版本 1.0.0 -> 1.0.0-0
$ npm version prerelease
版本号更新后,我们就可以进行版本的发布npm publish
3.2 预发布版本
很多时候一些新改动,并不能直接发布到稳定版本上(稳定版本的意思就是使用 npm install demo 即可下载的最新版本),这时可以发布一个 “预发布版本“,不会影响到稳定版本。1
2
3# 发布一个 prelease 版本,tag=beta
$ npm version prerelease
$ npm publish --tag beta
比如原来的版本号是 1.0.1,那么以上发布后的版本是 1.0.1-0,用户可以通过 npm install demo@beta 或者 npm install demo@1.0.1-0 来安装,用户通过 npm install demo 安装的还是 1.0.1 版本。
3.3、将 beta 版本设置为稳定版本
1 | # 首先可以查看当前所有的最新版本,包括 prerelease 与稳定版本 |
这时候,latest 稳定版本已经是 1.0.1-1 了,用户可以直接通过 npm install demo 即可安装该版本。
3.4、将 beta 版本移除
1 | # 将 beta 版本移除 |
自己实现的一个发包脚本
发包异常
- Error: 402 Payment Required
换了个名字,想起了自己见过的库,就模仿加了个 @ 前缀的包,再次发布的时候,报了下面的错误:Error: 402 Payment Required - PUT https://registry.npmjs.org/@xx/xx - You must sign up for private packages
查看文档,发现 @npm/package-name 这种形式的包名,是有作用域的包名形式,执行 npm publish 的时候默认是发布私有的包。因此,第一种方式是花钱买私有包的服务,另外一种方式就是指定参数,表示公开:npm publish --access public
需要注意的是这种形式的包名跟 npm 账户有对应关系,不能随便填写。npm init --scope=@my-org
这种形式表示是一个组织,my-org 对应是 npm 中的组织名。
npm init --scope=@my-username
install和update区别
1 | { |
总结: 两者最大的区别是在对待已经安装过的模糊版本时候
npm install会忽略模糊版本
npm update会更新模糊版本至最新
另外: install and update 处理 devDependencies 方式也不同
npm install 会安装/更新devDependencies,除非你指定 –production标志
npm update 会忽略 devDependencies,除非你指定 –dev 标志
包权限管理
很多时候,一个项目包往往不只是你一个人在管理的,这时需要给其他一起维护的同学开通发布的权限,相关使用命令如下:1
2
3
4
5
6
7
8# 查看模块 owner, 其中 demo 为模块名称
$ npm owner ls demo
# 添加一个发布者, 其中 xxx 为要添加同学的 npm 账号
$ npm owner add xxx demo
# 删除一个发布者
$ npm owner rm xxx demo
安装npm包
windows 安装node-sass
使用node-sass模块,npm install安装一直失败,尝试了很多方法,最终找到了这个方法,简直棒极了!
两种方法:
第一种:
1.先检查项目的node_modules文件夹是否存在node-sass文件夹,存在,删掉,不存在,执行第二步;
2.打开cmd,在项目根目录下输入以下代码npm install node-sass --sass-binary-site=http://npm.taobao.org/mirrors/node-sass
或SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ npm install node-sassset SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/
或者
在你的project下创建一个 .npmrc 文件
在文件中添加 sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
第二种:
进入项目的node_modules目录下;
2.使用git克隆node-sass源码:Git路径为:git clone https://github.com/sass/node-sass.git
3.使用编辑器,进入node_modules/node-sass/package.json文件中;
4.使用编辑器,将package.json文件中nodeSassConfig>binarySite的值修改为淘宝镜像地址;
5.在cmd进入node-sass文件夹中,执行以下命令:npm install
即可等待node-sass安装成功
node-sass -v
node-sass::gyp ERR! build error
c++编译异常问题。
1 | // 只是一下verbose。会安装成功 |
- check your node-sass version in your package.json and compare with the following table:
NodeJS | Supported node-sass version | Node Module
– | – | –
Node 16 | 6.0+ | 93
Node 15 | 5.0+ | 88
Node 14 | 4.14+ | 83
Node 13 | 4.13+, <5.0 | 79
Node 12 | 4.12+ | 72
Node 11 | 4.10+, <5.0 | 67
Node 10 | 4.9+, <6.0 | 64
Node 8 | 4.5.3+, <5.0 | 57
Node <8 | <5.0 | <57
<!– 3. install the Nodejs version according with your node-sass - clean old node_modules with: rm -rf node_modules
- run: npm install –>
node-gyp 问题
Err: sh -c node-pre-gyp install --fallback-to-build
Err: binding.gyp not found (xxx/xxx/xxx) while trying to load binding.gyp
执行:npm install -g node-gyp, 卸载后重新安装.然后再进行npm install。
一般是安装npm包回遇到问题,比如:canvas,ccap图形验证码1
2
3
4
5
6
7
8npm cache verify
npm uninstall -g node-gyp
npm uninstall node-gyp
sudo npm install -g node-gyp@3.4.0 --save
npm install -g canvas
# npm i -g node-gyp@latest && npm config set node_gyp "/usr/local/lib/node_modules/node-gyp/bin/node-gyp.js"
node-canvas
Err: pkg-config: command not found1
brew install pkg-config cairo pango libpng jpeg giflib librsvg
electron安装
在你的npmrc文件里添加淘宝npm源,Windows用户可以参考下面的路径:1
2registry=https://registry.npm.taobao.org/
ELECTRON_MIRROR=http://npm.taobao.org/mirrors/electron/
也可以使用下面命令:ELECTRON_MIRROR=https://npm.taobao.org/mirrors/electron/ npm install --save-dev electron
peer deps
peer react@"^16.0.0-0" from enzyme-adapter-react-16@1.15.6 npm ERR! node_modules/enzyme-adapter-react-16 npm ERR! dev enzyme-adapter-react-16@"^1.15.6" from the root projectCould not resolve dependency: npm ERR! peer react@"^16.0" from @react-native-community/masked-view@0.1.10
Please try again with the –legacy-peer-deps option.
The –legacy-peer-deps flag was introduced with v7 of npm as a way to bypass peerDependency auto-installation; it tells NPM to ignore peer deps and proceed with the installation anyway. This can cause some unwanted behavior and I would not suggest it.
npm安装出错
SSL Error: CERT_UNTRUSTED while using npm command
# 实际
通过安装n包,更新node成功了。之后出现问题是退出当前工作目录,重新进入就好了。(服务端同学,把工作目录全量更新了,然后npm命令就不可以执行了,不知道他全量更新做了什么)
# node npm install Error: CERT_UNTRUSTED
ssl验证问题,使用下面的命令取消ssl验证即可解决
npm config set strict-ssl false
错误error-code-ELIFECYCLE,执行如下命令
npm cache clear –force
npm install -g npm
# SSL Error: CERT_UNTRUSTED while using npm command
### 1
You can bypass https using below commands:npm config set strict-ssl false
or set the registry URL from https or http like below:npm config set registry="http://registry.npmjs.org/"
### 2
Update your node.js installation.The following commands should do it (from here):
sudo npm cache clean -f
sudo npm install -g n
sudo n stable
-RPC failed,curl 18 transfer closed with outstanding read data remaining
项目太久,资源文件太大. $_PS: 最后也没有下载下来,换了一个仓库。
原因1:缓存区溢出。网上大部分解决措施:
git config –glob al http.postBuffer 524288000
可能原因2:网络下载速度缓慢
git config –global http.lowSpeedLimit 0
git config –global http.lowSpeedTime 999999
第三:如果依旧clone失败,则首先浅层clone,然后更新远程库到本地
git clone –depth=1 http://gitlab.xxx.cn/yyy/zzz.git
cd large-repository
git fetch –unshallow
其他方式,一般clone http方式的容易产生此问题,改成SSH的方式也有效,即https://改为git://
command not found
bash: vue: command not found
npm 全局路径不对或 node_modules 的路径未设置
三、查看npm全局路径:npm root -g
得出/usr/local/node/lib/node_modules,检查是否正确的路径。
若存在问题可重新指定:
npm config set prefix /usr/local
MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”
错误原因:缺少windows构建插件;
全局安装windows构建工具,执行如下命令即可!npm install --global --production windows-build-tools
ERROR in Module build failed (from ./node_modules/sass-loader/lib/loader.js):
sass-loader 降低版本号