独书先生 Menu

Viewing all items for tag node

彻底解决npm install卡住不动npm安装报错最全指南

问题

在使用npm install安装某个npm依赖包时,比如安装vue

npm install vue

发现进度条一直卡住不动,或者一个包下载很久,相信很多朋友也遇到过。原因应该是国内的网络连接npm速度比较慢,甚至很多的依赖包都无法直接下载下来。那么如何解决这个问题呢?

写在前面:

本文的内容大致为笔者在使用很多方案没有很好的效果之后,还是选择了买付费vpn来解决,如果已经对这个npm安装问题有所了解的,建议直接开始使用VPN。推荐笔者用的一个很稳定的VPN:Express VPN

为什么推荐Express VPN

正文开始:

方案一:淘宝镜像

npm淘宝镜像源是淘宝出品的专为npm安装加速的国内镜像代理站,官方说明是每10分钟同步一次。国内代理也是用淘宝镜像最多,并且服务稳定。

代理的原理很简单,国外的服务器距离我们比较远,连接上去当然比较慢了,国内的淘宝服务器就多了,又近,当然你就比较快了。

使用淘宝的代理镜像有三种具体方案,下面给大家详细说明

  1. 一是当你是单个依赖无法安装的时候,可以简单的在安装命令后面加上--registry=https://registry.npm.taobao.org,将此次安装的npm源切换到淘宝的npm镜像站。比如安装vue
npm install vue --registry=https://registry.npm.taobao.org # 一次性使用淘宝镜像

这个方案的好处是,针对个别的依赖库操作即可,不需要安装额外的依赖或者修改配置。

  1. 二是切换npm源的方式。直接把npm安装时用的来源切换到淘宝npm.taobao.org,就不用每次输入后缀了。设置
npm config set registry https://registry.npm.taobao.org #  设置npm镜像源为淘宝镜像

之后安装依赖还是正常的npm命令就行。

后续如果不想使用npm.taobao.org作为源了,可以重新切换回来

npm config set registry http://registry.npmjs.org # 设置npm镜像源为淘宝镜像

npm config get registry  # 查看npm当前镜像源

  1. 三是采用cnpm的安装方式,本质是也是切换镜像源。先安装cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org # 目的是安装cnpm这个库,也是采用一次性使用淘宝镜像的方式

再在安装npm包时把npm 改为cnpm即可,比如安装vue

cnpm install vue

这个方法的好处是,同时支持cnpm和npm两种方式安装npm包,而不用像前面两个方法一样,要么加后缀要么重新切换源。

注意点:淘宝镜像源的方案也不是一劳永逸的,因为有小伙伴反馈说用了淘宝镜像安装后的依赖库有问题,但是用npm安装的就没问题,这种情况很少出现,但是一旦遇到,就是大坑,小伙伴们注意防范。

方案二:yarn

yarn是新一代替代npm安装依赖包的方案,更好的处理依赖树,所以有些npm安装失败的问题,换成yarn可能就好了。

这里简要列出各个系统环境下的安装方法,如有疑问,可以访问yarn中文网参考详细教程
1. windows环境下,需要去官网下载yarn软件

yarn下载
2. macOS推荐直接使用brew安装

brew install yarn
  1. CentOS也是命令安装
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo

sudo yum install yarn

安装完后,使用以下命令测试yarn是否安装成功

yarn --version

然后我们就可以使用yarn来安装npm包了,这里贴出常用的一些命令对比。

npm Yarn
npm install yarn add
npm install [package] –save yarn add [package]
npm install [package] –save-dev yarn add [package] –dev
npm install [package] –global yarn global add [package]
npm update –global yarn global upgrade
npm rebuild yarn add –force
npm uninstall [package] yarn remove [package]
npm cache clean yarn cache clean [package]
rm -rf node_modules && npm install yarn upgrade
npm version major yarn version –major
npm version minor yarn version –minor
npm version patch yarn version –patch

同样的如方案一,yarn可能也需要配合切换镜像源使用。如下可以参考

yarn config get registry  #  查看yarn当前镜像源

yarn config set registry https://registry.npm.taobao.org/  #  设置yarn镜像源为淘宝镜像

另外,现在一些大型第三方库也在推荐使用yarn安装依赖库,比如vue,这个可以作为重要的参考。但也不是绝对,因为也有小伙伴反馈用yarn出了问题,但是用npm是正常的。

因为每个人做的项目不同,npm依赖间的关系错综复杂,很多时候还要看点运气,或者你测出了别人没遇到的bug,毕竟,这些底层工具也是代码写的,代码写的就可能有bug,找到自己最适合的工具就好。

方案三:专线链接

如果前两个方案都不太奏效,小编只能推荐一个终极大招了,彻底解决npm卡住不动,npm下载慢,npm安装报错等各种网络问题–科学上网专线直连。为什么是大招,小编你是不是忽悠我?

理由有两个,

  1. 一是虽然我们用了淘宝镜像源,但是第三方依赖包各种各样,奇葩的是还有的第三方库在下载的时候需要临时去别的网址下载它自己的依赖,而这个它自己的依赖咱们淘宝是没有代理的,或者说即使有的网址可以代理,那么多第三方库的额外网址,你也不可能都能帮你代理下载。最典型的依赖库如node-sassnode-gyp等(node-sass和node-gyp的坑不止一个,这个等小编哪天再出详细教程)
  2. 二是小编之前遇到过这类坑,无论采用cnpm,换镜像源,换yarn,各种删除依赖重新安装,都不行,最后还是采用更科学的方式,才得以节约宝贵的开发时间。毕竟,各种工具要为我们的工作效率服务才行,不然就不是好工具。如果我们为了节省资金,但是耗费了大量的时间研究踩坑而没有结果,那岂不是浪费了更多的资金了,时间比资金更贵。

好了,不卖关子了,明白这类工具的好处的小伙伴,自然明白时间和好工具的重要性,请直接到小编推荐的专业网站操作

排名第一的VPN: Express VPN

专线直连最直接的方案就是购买服务 —鲁迅(误)

如果对此工具还有疑问的小伙伴,请参考这篇解读欣赏下小编的踩坑辛酸泪。。。

为什么我会推荐Express VPN

参考

centos下安装 docker, git, node, python环境

1. git

yum install git

2. docker

centos下

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

或者参考docker-ce安装

3. node

1. install latest nvm

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

if no any response,try curl:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

v0.35.3 is latest version currently i use, change the version if you need.learn more aboutnvm

if you get error

curl: (7) Failed connect to raw.githubusercontent.com:443; Connection reset by peer

just try open the https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh in browser,download install.sh file manually, then upload to your server, tap sudo bash install.sh manually.

2. solve commond not found

source ~/.nvm/nvm.sh

3. install node v12.X latest version

nvm install 12

4. check node version

node -v

4. python 3

udo yum install yum-utils
sudo yum-builddep python
curl -O https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
tar xf Python-3.8.3.tgz
cd Python-3.8.3
./configure
make
sudo make install
alias python='/usr/local/bin/python3.8' #edit python command python3

自建node图片压缩服务

需求

图片压缩服务很常见,比如 tinypng.com,压缩图等,但是如何打造自己的图片压缩服务?

思路

首先想到使用tinypng.com提供的API,但是也是有限制或者购买服务,不符合我们自建服务的需要,我们需要完全开源的自有服务,于是了解到了imagemin,有node版本

解决方案

采用koa后台框架搭建node服务

  1. 先安装依赖
npm i imagemin imagemin-giflossy imagemin-mozjpeg imagemin-pngquant imagemin-svgo imagemin-webp
  1. 编写koa基础服务,参考https://www.liaoxuefeng.com/wiki/1022910821149312/1099849448318080

  2. 编写imagemin服务

// 安装依赖:npm i imagemin imagemin-giflossy imagemin-mozjpeg imagemin-pngquant imagemin-svgo imagemin-webp

const fs = require('fs');
const path = require('path');
const imagemin = require('imagemin');
const imageminMozjpeg = require('imagemin-mozjpeg');
const imageminPngquant = require('imagemin-pngquant');
const imageminGiflossy = require('imagemin-giflossy');
const imageminWebp = require('imagemin-webp');
const imageminSvgo = require('imagemin-svgo');

//stream pipeline
const util = require('util');
const stream = require('stream');

const imgMIMEList = {
    svg: 'image/svg+xml',
    png: 'image/png',
    jpg: 'image/jpeg',
    jpeg: 'image/jpeg',
    gif: 'image/gif',
    bmp: 'image/bmp',
    webp: 'image/webp',
    ico: 'image/x-icon',
    tif: 'image/tiff',
    psd: 'application/octet-stream',
}

//TODO:提示压缩率

const fn_imagemin = async (ctx, next) => {

    const file = ctx.request.files.file;    // 获取上传文件
    const reader = fs.createReadStream(file.path);  // 创建可读流
    const ext = file.name.split('.').pop();     // 获取上传文件扩展名
    const dataMIME = "data:" + imgMIMEList[ext] + ";base64,"; //根据扩展名设定媒体类型

    const imgName = getRandomId() + '.' + ext; //压缩图片文件名
    const imgSourcePath = `storage/upload/img`; //压缩源图片文件夹
    const imgResultPath = `storage/result/img`; //压缩目标文件夹

    const imgSourcePathFile = `${imgSourcePath}/${imgName}`; //压缩源图片路径
    const imgSourcePathFileCWD = path.resolve(process.cwd(), imgSourcePathFile); //压缩源图片绝对路径

    const imgSourcePathCWD = path.resolve(process.cwd(), imgSourcePath); //源文件夹绝对路径
    const imgResultPathCWD = path.resolve(process.cwd(), imgResultPath); //目标文件夹绝对路径

    const upStream = fs.createWriteStream(imgSourcePathFileCWD); // 创建可写流 存储源图片
    // reader.pipe(upStream);// 可读流通过管道写入可写流
    const pipeline = util.promisify(stream.pipeline);
    let resultData = null;
    await pipeline(reader, upStream);
    await imageCompress(imgSourcePathFile, imgResultPath, (imgBuffer) => {

        resultData = dataMIME + imgBuffer.toString('base64');

    }).catch((err) => {
        ctx.response.status = 201
    })

    //删除图片
    setTimeout(()=>{
        deleteFile(imgSourcePathCWD,imgName);
        deleteFile(imgResultPathCWD,imgName);
    },0)

    if (file) {
        ctx.response.body = resultData;
    }
    else {
        ctx.response.status = 204;
    }

};

/**
 * 压缩图片
 * @param {String} sourcePath 
 * @param {String} resultPath 
 * @param {Function} callback 
 */
async function imageCompress(sourcePath, resultPath, callback) {
    const files = await imagemin([sourcePath], {
        destination: resultPath,
        plugins: [
            imageminMozjpeg({
                quality: 70
            }),
            imageminPngquant(),
            imageminGiflossy({
                lossy: 80
            }),
            imageminWebp(),
            imageminSvgo()
        ]
    });

    const imgBuffer = files[0].data;
    callback(imgBuffer)
}

/**
 * 获取随机id
 */
function getRandomId() {
    return Math.random().toString(36).substr(2) + Date.now().toString(36);
}


/**
 * 删除某一个包下面的需要符合格式的文件。
 * @param  {String} url  文件路径,绝对路径
 * @param  {String} name 需要删除的文件名称
 * @return {Null}   
 * @author huangh 20170123
 */
function deleteFile(url,name){
    let files = [];

    if( fs.existsSync(url) ) {    //判断给定的路径是否存在

        files = fs.readdirSync(url);    //返回文件和子目录的数组

        files.forEach(function(file,index){

            let curPath = path.join(url,file);

            if(fs.statSync(curPath).isDirectory()) { //同步读取文件夹文件,如果是文件夹,则函数回调
                deleteFile(curPath,name);
            } else {   

                if(file.indexOf(name)>-1){    //是指定文件,则删除
                    fs.unlinkSync(curPath);
                    console.log("删除文件:"+curPath);
                }
            }  
        });
    }else{
        console.log("给定的路径不存在!");
    }

}



module.exports = {
    'POST /upload/img': fn_imagemin
};

注意

本教程在于提供可行思路及核心代码,完整项目程序暂未整理.因为笔者在编写过程中发现,本地windows环境没有问题,但是docker环境下无法正常运行,所以整体的node服务仍然处于研究阶段,希望有兴趣的朋友实验成功后分享出来.

参考

https://github.com/imagemin/imagemin
https://web.dev/use-imagemin-to-compress-images/
https://www.liaoxuefeng.com/wiki/1022910821149312/1099849448318080

gnvm切换node版本

问题:

npm运行项目时,报错:

Found binding for the following environments:
- Windows 64-bit with Node.js 11.x

发现此项目的npm包需要11.x版本node,那么为了不影响其他项目,可以采取管理多个node版本的方法,跟多版本python类似

Continue reading…

Nuxt VSCODE node调试

问题

Nuxt使用时是有server端的,服务端使用node, 要想启动服务端代码的调试功能, 就需要额外配置

解决方案

在编辑器里启动调试功能,用VSCODE最佳,(使用谷歌浏览器也可以,但是比较麻烦,这里暂不研究)
  Continue reading…

完全卸载node npm

如何从Windows中删除Node.js

1.开始-搜索: node – 点击 uninstall node.js,  或者 从卸载程序卸载程序和功能。

2.重新启动(或者您可能会从任务管理器中杀死所有与节点相关的进程)。

3.寻找这些文件夹并删除它们(及其内容)(如果还有)。根据您安装的版本,UAC设置和CPU架构,这些可能或可能不存在:

C:\Program Files (x86)\Nodejs
C:\Program Files\Nodejs
C:\Users{User}\AppData\Roaming\npm(或%appdata%\npm)
C:\Users{User}\AppData\Roaming\npm-cache(或%appdata%\npm-cache)

4.检查您的%PATH%环境变量以确保没有引用Nodejs或npm存在。

5.如果仍然没有卸载,请where node在命令提示符下键入,您将看到它所在的位置 – 删除(也可能是父目录)。

6.重新启动,很好的措施。

以上就是删除node、卸载npm的全部方法了,通常,我们还会遇到安装npm模块报错,npm install安装卡住等情况,可以参照这篇博文 彻底解决npm install卡住不动npm安装报错最全指南

注意

小编经过多年的实践得到一个经验,不仅仅是处理上面说的npm安装问题,还有google搜索一些技术问题,一般来说谷歌的搜索结果更好,还有一些国外的技术网站分享的知识一般比较前沿,比如medium就必须翻墙才能上,想关注Twitter大佬也必须有梯子,大家也肯定遇到过GitHub clone开源项目大的项目基本clone不下来的情况。。。等等。

所以小编的经验是,每一个开发者都必须得有一个稳定可靠的梯子软件才能顺畅的开发。一个稳定的梯子可能可以解决你某个问题90%的部分,节省不少时间,可以说是程序员必备的软件,这里推荐笔者用过的 ExpressVPN

至于为什么选择Express VPN可以看这一篇解释:好用的VPN推荐

更多npm教程:

参考自: https://appsoftea.com/zh/uninstall-node-npm/, 感谢!