关于npm:jenkinsdocker实现自动测试并发布到你的npm包

背景前端的开源我的项目公布的步骤: 将代码提交到GitHub;运行单元测试;公布到npm上;以上步骤每次公布都要做一边,不仅繁冗,而且人工实现容易出错,因而通过自动化来实现这些工作变得很有必要。浏览本文须要你对应用jenkins + docker来实现自动化部署有肯定实践经验。 实现流程将代码通过git提交至GitHub;GitHub的webhook触发jenkins的pipeline工作;pipeline工作执行测试命令;测试通过后,比照npm线上的包和以后package.json中的版本号;版本号不同的状况下构建代码,登录npm,将包公布到npm;实现原理本文不打算从零开始讲述每个实现的步骤和细节,只讲实现流程中一些比拟有价值的办法和原理。 代码提交到GitHub触发jenkins的pipeline工作装置一个jenkins插件:multibranch-scan-webhook-trigger关上pipeline工作的配置,找到扫描 仓库 触发器,勾选Scan by webhook,并且在Trigger token中填入一个随机的字符串。关上GitHub代码仓库 -> 点击Settings -> 点击Webhooks-> 点击Add webhook -> 在Payload URL中填入:JENKINS_URL/multibranch-webhook-trigger/invoke?token=Trigger token,其中JENKINS_URL是你的jenkins服务地址,Trigger token则对应步骤2填入的随机字符串。实现以上配置,下次你提交代码就会主动触发对应的pipeline工作。 如何通过shell脚本登录npm公布npm包只须要执行: npm publish --access public然而前提是要先登录你的npm账户,通常状况下能够通过执行npm login,而后输出用户名、明码、邮箱即可登录,然而在jenkins中没法实现这种交互式输出的。解决办法是装置npm-cli-login,这样就能够通过以下脚本间接登录: NPM_USER=testUser NPM_PASS=testPass NPM_EMAIL=test@example.com npm-cli-login如何比照线上npm包的最新版本号和以后代码中的版本号某些状况下你只是想提交内容到GitHub上,并不想公布新的包到npm上。所以不能每次一提交代码就公布npm包的,须要先判断以后版本号是否和线上的统一,如果统一则不公布包,反之则公布。1.获取线上npm包的版本号,能够通过以下脚本获取 npm view <package name> version2.获取以后我的项目代码的版本号 node -p "require('./package.json').version"3.比照两个版本号 versionOnline=$(npm view <package name> version)versionLocal=`node -p "require('./package.json').version"`if [ "$versionOnline" != "$versionLocal" ]; then// 公布fi残缺的脚本versionOnline=$(npm view <package name> version)versionLocal=`node -p "require('./package.json').version"`if [ "$versionOnline" != "$versionLocal" ]; thennpm install -g npm-cli-login --registry=https://registry.npm.taobao.orgNPM_USER=${NPM_USER} NPM_PASS=${NPM_PASS} NPM_EMAIL=${NPM_EMAIL} npm-cli-loginnpm publish --access publicfi其它一些绝对大型的开源库还须要部署文档等操作,也能够用jenkins来实现,这样整个公布流程须要手动实现的就只剩下提交代码了。 ...

February 7, 2021 · 1 min · jiezi

关于npm:升级

vue-cli: npm i -g @vue/cli 最新版本

February 5, 2021 · 1 min · jiezi

关于npm:vue-20中引入sass的完整解决方案

1. sass-loader依赖于node-sass,所以要装置node-sass npm install node-sass --save-dev       //装置node-sassnpm install sass-loader --save-dev         //装置依赖包sass-loadernpm install style-loader --save-dev        //装置style-loader 2. 在build文件夹下的webpack.base.conf.js的module下 rules外面增加配置 {test: /.sass$/,loaders: ['style', 'css', 'sass']}, 如果我的项目没有起来报错了能够参考看以下解决方案: 1.这是vue我的项目(由vue-cli创立)引入sass后,打包我的项目呈现的谬误。这个谬误是sass-loader版本造成的 解决方案:在package.json中将 “sass-loader”:"^10.0.1"版本批改为"sass-loader": "^7.3.1",而后从新npm install 2.创立完这个文件当前,又呈现了新的谬误“Node Sass version 5.0.0 is incompatible with ^4.0.0.” 解决方案: 卸载已装置版本 npm uninstall node-sass 装置 npm install node-sass@4.14.1胜利解决问题。我的项目打包胜利最初总结一下当用vue-cli创立一个vue我的项目时,引入sass的步骤[不必配置,因为vue-cli中曾经给咱们配置好了] 1.下载安装:npm i node-sass sass-loader style-loader -D 2.能够开始用了【lang="scss"】 不想本人总结报错起因了,这是报错解决原文链接https://www.cnblogs.com/qiuyi... 看文章的时候肯定要仔细,粗枝大叶那只能耗费你本人的工夫了!!

January 31, 2021 · 1 min · jiezi

关于npm:Browserslist-caniuselite-is-outdated

Browserslist: caniuse-lite is outdated. Please run the following command: yarn upgrade 更新记录如下:yarn upgrade caniuse-lite browserslist 没用仍旧报下面的错删除node_modules 重装 == 仍旧没用删除 yarn.lock == yarn install 不报上述谬误了,我的项目build却炸了,不能随便删除lock文件啊npx browserslist@latest --update-db 参考上述操作之后,不报 Browserslist ,报 postcss autoprefixer 谬误去掉webpack.config.js 外面 postcss-loader 变得失常了遂更新 postcss-loader, autoprefixer 至最新,仍旧报错,参考stackoverflow解决了另计:换了一台电脑,执行到第四步就好了,真是难以捉摸的npm

January 29, 2021 · 1 min · jiezi

关于npm:npm-与packagejson命令

npm uninstall <package-name> --save-dev 删除指定包并落到package文件上npm install <package-name>@xx.xx --save-dev 装置指定版本号包

January 11, 2021 · 1 min · jiezi

关于npm:缓存清理

缓存清理 npm cache clean --force yarn cache clean

January 11, 2021 · 1 min · jiezi

关于npm:Git管理使用shell脚本和nodejs实现快速commit和打tag

思考前端应用npm和git进行开发工作时,会有版本号或者变更须要同步更新提交。通过commit提交更新信息时,是不是能够将commit信息利用起来,成为咱们工作时变更的版本日志数据? 话不多说,码上分享。 应用形式 执行命令: sh bin/commit.sh运行步骤 1.输出commit信息2.抉择更新类型3.抉择是否提交tag 实现形式 一、 创立相干文件 bin/commit.sh //执行脚本bin/commit.js //日志文件更新bin/version.js //package.json版本更新bin/version_log.json //版本日志文件package.json //npm依赖配置文件二、 要害代码 先带大家看一下版本日志文件 version_log.json[ { "date": "2021-01-01 00:00:00", "version": "0.0.1", "commit": "[更新]创立提交命令及更新日志脚本测试" }]这是一个规范的json格式文件,通过数组将版本信息存入其中,因为我是将最新的版本放到数组尾部,所以每次只须要提取最初一个匹配到的version信息进行辨认版本号操作 接下来是要害的sh命令,和开发者产生交互,由开发者填写本次的版本更新日志,抉择更新版本的类型,以及是否进行tag标签提交的选项#!/bin/bashcd bin/#=========读取最初一个版本信息=========versions=($(cat ./version_log.json | awk -F 'version' '/version/{print$0}' | sed 's/ //g' ))versions_length=${#versions[@]}newest_version_str=${versions[versions_length-1]}newest_version_str_length=${#newest_version_str}#获取字符前面索引值newest_version_str_length_end=$[newest_version_str_length-2-11]old_version=${newest_version_str:11:$newest_version_str_length_end}versionArr=[]v=${old_version//./ }index=0for i in $v; do versionArr[index]=$i index=$[index+1]doneread -p "请提交变动信息:" commit_msg#=========执行更新类别抉择(默认bug修复)=========commitPrefix="[修复]"echo "====== 1. 迭代 ======"echo "====== 2. 更新 ======"echo "====== 3. 修复 ======"read -p "请抉择变动类型 (默认:3) :" levelcase $level in 1) echo '您已抉择版本迭代' versionArr[0]=$[versionArr[0]+1] versionArr[1]=0 versionArr[2]=0 commit="[迭代]"$commit_msg ;; 2) echo '您已抉择小更新' versionArr[1]=$[versionArr[1]+1] versionArr[2]=0 commit="[更新]"$commit_msg ;; 3) echo '您已抉择修复' versionArr[2]=$[versionArr[2]+1] commit="[修复]"$commit_msg ;; *) echo '您已默认抉择修复' versionArr[2]=$[versionArr[2]+1] commit="[修复]"$commit_msg ;;esacnow_date=`date "+%Y-%m-%d_%H:%M:%S"`echo $now_dateversion=${versionArr[0]}'.'${versionArr[1]}'.'${versionArr[2]}echo $versionaddInfo="{\"date\":\"$now_date\",\"version\":\"$version\",\"commit\":\"$commit\"}"#=========更新版本日志文件信息=========node commit $addInfo#同步更新package.json版本号node versiongit commit -am $commitread -p "是否增加Tag(Git)1/0:" is_add_tagecho $is_add_tagif(($is_add_tag == 1 ))then echo "您已抉择推送Git标签,行将执行..." git tag $version git push origin --tags develse echo "您未抉择推送Git标签,行将完结..." git push origin devfiexit 1而后是对两个json文件的读写操作node命令commit.js ...

January 1, 2021 · 2 min · jiezi

关于npm:域名解析失败的解决方法

问题的发现最近拜访github,网页上的图片总是拜访不了,我认为公司网络禁止了,不影响,也就没有解决clone我的项目后,yarn & install都报错,报错信息如下:Error: getaddrinfo ENOENT raw.githubusercontent.com at GetAddrInfoReqWrap.onlookup域名地址解析失败,导致地址无奈连贯 解决办法查问域名对应的实在IP https://www.ipaddress.com批改host文件1). 对应地址: windows: %systemroot%\system32\drivers\etclinux: /etc/hosts2).关上文件后增加在1上查找到的地址和ip(这个对应的须要本人去查一下,网上一些旧的用也是不能够的)eg: # github相干52.74.223.119 github.com192.30.253.119 gist.github.com54.169.195.247 api.github.com185.199.111.153 assets-cdn.github.com151.101.108.133 user-images.githubusercontent.com199.232.96.133 gist.githubusercontent.com199.232.96.133 cloud.githubusercontent.com199.232.96.133 camo.githubusercontent.com199.232.96.133 raw.githubusercontent.com199.232.96.133 avatars0.githubusercontent.com199.232.96.133 avatars1.githubusercontent.com199.232.96.133 avatars2.githubusercontent.com199.232.96.133 avatars3.githubusercontent.com199.232.96.133 avatars4.githubusercontent.com199.232.96.133 avatars5.githubusercontent.com199.232.96.133 avatars6.githubusercontent.com199.232.96.133 avatars7.githubusercontent.com199.232.96.133 avatars8.githubusercontent.comwindows 批改host失效办法关上cmd窗口ipconfig /displaydns &:: # 显示所有 dns内容 ipconfig /flushdns &:: # 刷新所有 dns内容原理要理解这个问题的实质,咱们应该回忆一下,一个网页关上的时候,通过了哪些解决,用一张图看一下 从上图能够看到,咱们域名解析先会拿本地的缓存(浏览器/电脑),当咱们无奈域名解析失败的时候,咱们能够先去https://www.ipaddress.com网站查问网站对应的ip信息,用缓存的形式间接在本地增加对应的解析规定,这样便能够失常拜访

December 29, 2020 · 1 min · jiezi

关于npm:教你如何把HackTheBox里面的Luke干掉

与平常一样,第一步是对主机进行Nmap辨认正在运行的服务: `Nmap scan report for 10.10.10.137Host is up (0.042s latency).Not shown: 65464 closed ports, 66 filtered portsPORT STATE SERVICE VERSION21/tcp open ftp vsftpd 3.0.3+ (ext.1)| ftp-anon: Anonymous FTP login allowed (FTP code 230)|_drwxr-xr-x 2 0 0 512 Apr 14 12:35 webapp| ftp-syst: | STAT: | FTP server status:| Connected to 10.10.13.75| Logged in as ftp| TYPE: ASCII| No session upload bandwidth limit| No session download bandwidth limit| Session timeout in seconds is 300| Control connection is plain text| Data connections will be plain text| At session startup, client count was 1| vsFTPd 3.0.3+ (ext.1) - secure, fast, stable|_End of status22/tcp open ssh?80/tcp open http Apache httpd 2.4.38 ((FreeBSD) PHP/7.3.3)| http-methods: |_ Potentially risky methods: TRACE|_http-server-header: Apache/2.4.38 (FreeBSD) PHP/7.3.3|_http-title: Luke3000/tcp open http Node.js Express framework|_http-title: Site doesn't have a title (application/json; charset=utf-8).8000/tcp open http Ajenti http control panel|_http-title: AjentiNo exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).TCP/IP fingerprint:OS:SCAN(V=7.70%E=4%D=8/13%OT=21%CT=1%CU=33830%PV=Y%DS=2%DC=T%G=Y%TM=5D52853OS:5%P=x86_64-pc-linux-gnu)SEQ(SP=101%GCD=1%ISR=10D%TI=Z%CI=Z%II=RI%TS=21)OOS:PS(O1=M54DNW6ST11%O2=M54DNW6ST11%O3=M54DNW6NNT11%O4=M54DNW6ST11%O5=M54DNOS:W6ST11%O6=M54DST11)WIN(W1=FFFF%W2=FFFF%W3=FFFF%W4=FFFF%W5=FFFF%W6=FFFF)EOS:CN(R=Y%DF=Y%T=40%W=FFFF%O=M54DNW6SLL%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%FOS:=AS%RD=0%Q=)T2(R=N)T3(R=Y%DF=Y%T=40%W=FFFF%S=O%A=S+%F=AS%O=M54DNW6ST11%ROS:D=0%Q=)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%OS:S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(OS:R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=40%IPL=164%UN=0OS:%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=S%T=40%CD=S)Network Distance: 2 hopsTRACEROUTE (using port 587/tcp)HOP RTT ADDRESS1 40.68 ms 10.10.12.12 40.94 ms 10.10.10.137OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .Nmap done: 1 IP address (1 host up) scanned in 4814.02 seconds` * 1* 2* 3* 4* 5* 6* 7* 8* 9* 10* 11* 12* 13* 14* 15* 16* 17* 18* 19* 20* 21* 22* 23* 24* 25* 26* 27* 28* 29* 30* 31* 32* 33* 34* 35* 36* 37* 38* 39* 40* 41* 42* 43* 44* 45* 46* 47* 48* 49* 50* 51* 52* 53从该输入中咱们能够看到有很多凋谢的端口。我看到的第一个是FTP,因为它容许匿名登录。 ...

December 26, 2020 · 4 min · jiezi

关于npm:教你如何把HackTheBox里面的Luke干掉

与平常一样,第一步是对主机进行Nmap辨认正在运行的服务: `Nmap scan report for 10.10.10.137Host is up (0.042s latency).Not shown: 65464 closed ports, 66 filtered portsPORT STATE SERVICE VERSION21/tcp open ftp vsftpd 3.0.3+ (ext.1)| ftp-anon: Anonymous FTP login allowed (FTP code 230)|_drwxr-xr-x 2 0 0 512 Apr 14 12:35 webapp| ftp-syst: | STAT: | FTP server status:| Connected to 10.10.13.75| Logged in as ftp| TYPE: ASCII| No session upload bandwidth limit| No session download bandwidth limit| Session timeout in seconds is 300| Control connection is plain text| Data connections will be plain text| At session startup, client count was 1| vsFTPd 3.0.3+ (ext.1) - secure, fast, stable|_End of status22/tcp open ssh?80/tcp open http Apache httpd 2.4.38 ((FreeBSD) PHP/7.3.3)| http-methods: |_ Potentially risky methods: TRACE|_http-server-header: Apache/2.4.38 (FreeBSD) PHP/7.3.3|_http-title: Luke3000/tcp open http Node.js Express framework|_http-title: Site doesn't have a title (application/json; charset=utf-8).8000/tcp open http Ajenti http control panel|_http-title: AjentiNo exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).TCP/IP fingerprint:OS:SCAN(V=7.70%E=4%D=8/13%OT=21%CT=1%CU=33830%PV=Y%DS=2%DC=T%G=Y%TM=5D52853OS:5%P=x86_64-pc-linux-gnu)SEQ(SP=101%GCD=1%ISR=10D%TI=Z%CI=Z%II=RI%TS=21)OOS:PS(O1=M54DNW6ST11%O2=M54DNW6ST11%O3=M54DNW6NNT11%O4=M54DNW6ST11%O5=M54DNOS:W6ST11%O6=M54DST11)WIN(W1=FFFF%W2=FFFF%W3=FFFF%W4=FFFF%W5=FFFF%W6=FFFF)EOS:CN(R=Y%DF=Y%T=40%W=FFFF%O=M54DNW6SLL%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%FOS:=AS%RD=0%Q=)T2(R=N)T3(R=Y%DF=Y%T=40%W=FFFF%S=O%A=S+%F=AS%O=M54DNW6ST11%ROS:D=0%Q=)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%OS:S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(OS:R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=40%IPL=164%UN=0OS:%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=S%T=40%CD=S)Network Distance: 2 hopsTRACEROUTE (using port 587/tcp)HOP RTT ADDRESS1 40.68 ms 10.10.12.12 40.94 ms 10.10.10.137OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .Nmap done: 1 IP address (1 host up) scanned in 4814.02 seconds` * 1* 2* 3* 4* 5* 6* 7* 8* 9* 10* 11* 12* 13* 14* 15* 16* 17* 18* 19* 20* 21* 22* 23* 24* 25* 26* 27* 28* 29* 30* 31* 32* 33* 34* 35* 36* 37* 38* 39* 40* 41* 42* 43* 44* 45* 46* 47* 48* 49* 50* 51* 52* 53从该输入中咱们能够看到有很多凋谢的端口。我看到的第一个是FTP,因为它容许匿名登录。 ...

December 26, 2020 · 4 min · jiezi

关于npm:npm-link

npm link 办法,可在我的项目开发中应用 npm 包,用于排查问题,或不便的检测 npm 包在我的项目中的应用 npm 包cd [module]npm link我的项目内cd examplenpm link [module]

December 18, 2020 · 1 min · jiezi

关于npm:npm-报错

1.“This is probably not a problem with npm. There is likely additional logging output above. ”解决办法: rm -rf node_modulesrm package-lock.jsonnpm cache clear --forcenpm install2 “npm ERR! A complete log of this run can be found in: npm ERR! D:\node\node_cache\_logs\2020-06-13T08_12_35_648Z-debug.log” 解决办法 npm install npm -g npm install 装置一下依赖即可npm 报错个别是短少依赖 【视状况 认真看报错信息】文件援用谬误 【视状况 认真看报错信息】node_moudule依赖问题 【删除从新下载】webpack版本问题 【版本过高,升高版本】node的版本问题 【版本过高,升高版本】

December 15, 2020 · 1 min · jiezi

关于npm:yarn-npm-使用的正确姿势

一个跟npm一样的包管理工具Yarn 缓存了每个下载过的包,所以再次应用时无需反复下载。 这一点也是我喜爱的一点,下载十分稳,不存在丢包状况 装置 假如你曾经装过Node重置缓存地位 如果你windows用户, 你会发现为什么系统盘会越来越大,越来越卡,因为你所下载的模块都缓存默认缓存到了C盘,npm npm cache clean --force //革除缓存//批改全局模块地位npm list -g --depth 0 // 查看npm全局模块npm config set prefix "D:Program Filesnodejsnode_modulesnpmData" //必须字符串 npm list -g --depth 0 // 在查看npm全局模块//以前的模块能够间接删掉//批改缓存地位npm config get cache //查看缓存地位npm config set cache "D:Program Filesnodejsnode_modulesnpmData"npm config get cache //查看缓存地位// 留神 须要设置目录零碎环境变量// 如果不会 百度一哈 这个是惯例操作 // 将这个门路增加 零碎Path D:Program Filesnodejsnode_modulesnpmData yarn 装置 yarnnpm i yarn -g // 应用命令行装置yarn --version // 胜利呈现版本号 操作,根本与下面统一yarn cache clean //革除历史缓存// 全局模块装置地位批改yarn global dir //查看yarn config set global-folder D:yarnDataglobal //主动创立文件夹yarn global dir //查看目录地位//批改缓存地位yarn cache dir //显示yarn显示地位yarn config set cache-folder D:yarnDataglobal yarn cache dir //在输入一下目录 看看缓存地位// 留神 须要设置目录零碎环境变量,留神是bin 目录否则无奈找到模块// 将这个门路增加 零碎环境 Path D:yarnDataglobalnode_modules.bin 源管理工具 ...

December 7, 2020 · 2 min · jiezi

关于npm:搭建超级小班课网课系统

简介本场景介绍应用视频云技术搭建超级小班课网课零碎。 阿里云体验实验室地址(阿里云ECS体验场景体验)https://developer.aliyun.com/... 背景常识音视频通信: 音视频通信 RTC(Real-Time Communication)是阿里云笼罩寰球的实时音视频开发平台,提供高可用、高品质、超低延时的实时网络服务,实用于在线教育、互动娱乐、视频会议、保险定损、调度指挥等场景。应用阿里云RTC SDK,您能够在挪动、Web、PC等多端疾速搭建互通互联的实时音视频利用。 超级小班课: 超级小班课是将千名学生以小组模式分成若干小班(举荐4-6名为一组),同时由一名主讲名师和多名助教进行辅导。所有学生均能够实时观看主讲名师授课画面,并能够与名师进行连麦互动。多名助教实时关注小班内学生动静,保护小班课堂秩序,并可连麦小班内学生进行助教辅导。该场景不仅能够让优良的名师辅导更多的学生,更能够保障学生之间的互动性,让学生的学习效果大大增加。 超级小班课解决方案实用于K12和少儿语培等教育场景。 获取音视频通信利用AppKey1.应用您本人的阿里云账号登录到音视频通信RTC控制台。2.在左侧单击利用治理。3.在利用治理页面就能够看到您的默认利用的AppID。4.在默认利用的右侧操作列单击查问AppKey。 在查问Appkey提醒弹框中单击确定。 在查问胜利的弹框中就能够看到AppKey。连贯ECS服务器1.关上零碎自带的终端工具。 Windows:CMD或Powershell。MAC:Terminal。2.在终端中输出连贯命令ssh [username]@[ipaddress]。您须要将其中的username和ipaddress替换为第1大节中创立的ECS服务器的登录名和公网地址。例如: ssh root@123.123.123.123命令显示后果如下: 输出yes。批准持续后将会提醒输出登录明码。 明码为已创立的云服务的ECS的登录明码。登录胜利后会显示如下信息。 装置Node.js环境1.执行以下命令下载Node.js二进制包。 wget https://nodejs.org/dist/v14.15.0/node-v14.15.0-linux-x64.tar.xz2.执行以下命令将Node.js二进制包解压到门路/usr/local。 tar xf node-v14.15.0-linux-x64.tar.xz -C /usr/local/ --no-same-owner3.执行以下命令将Node.js二进制文件所在门路退出到环境变量PATH中。 echo "export PATH=/usr/local/node-v14.15.0-linux-x64/bin:$PATH" >> /etc/profile4.执行以下命令使批改的环境变量立刻失效。 source /etc/profile5.执行以下命令验证是否装置配置胜利。 node -v如果装置胜利将会有相似如下显示。 批改配置本场景中的ECS服务器/root门路中内置了超级小班课的我的项目源码和运行环境,在我的项目源码中填入本人的AppKey即可运行我的项目。1.执行以下命令应用Vim关上config.js文件。 cd superclass_web/ && vim src/core/data/config.js2.按下i键进入编辑模式,将appId和appKey批改为步骤二中查问到的AppId和AppKey。3.批改实现后按下Esc键退出编辑模式,而后输出以下指令并按下回车键退出Vim编辑器。 :wq运行Demo1.执行以下命令装置我的项目依赖。 npm install2.执行以下命令装置RTC SDK。 npm install aliyun-webrtc-sdk -S3.执行以下命令运行我的项目。 npm run serve运行胜利之后,默认会在浏览器关上我的项目主页。如果没有主动关上,请在浏览器地址栏输出https://[ipaddress]:888,ipaddress请参见步骤三。 Demo源码解析我的项目构造如下所示: ├── dist #打包文件├── public #动态资源├── src #我的项目文件目录│ ├── assets #动态资源 │ ├── components #公共组件│ ├── core #js文件│ │ ├── data│ │ │ ├── config.js #相干配置参数│ │ ├── util│ │ │ ├── utils.js #一些公共办法│ │ ├── rtc-engine.js #单例│ │ ├── rtc-clinet.js #RTC实例文件│ ├── plugins│ ├── router #路由│ ├── views #页面│ │ ├── login │ │ │ ├── login.vue #登录页面│ │ ├── student │ │ │ ├── student.vue #学生页面│ │ ├── assistant │ │ │ ├── assistant.vue #助教页面│ │ ├── teacher │ │ │ ├── teacher.vue #老师页面│ ├── vuex│ ├── App.vue #根组件│ ├── main.js #入口文件├── vue.config.js #vue配置文件上面列出了一些要害性功能代码。 ...

November 30, 2020 · 2 min · jiezi

关于npm:npm发布报错-403-Forbidden-PUT-httpsregistrynpmjsorg

首次注册npm账户,公布npm包报错npm ERR! code E403npm ERR! 403 403 Forbidden - PUT https://registry.npmjs.org/lanke-template-h5 - Forbiddennpm ERR! 403 In most cases, you or one of your dependencies are requestingnpm ERR! 403 a package version that is forbidden by your security policy.npm ERR! A complete log of this run can be found in:npm ERR! D:\NodeJS\node_cache\_logs\2020-11-27T03_42_41_070Z-debug.log解决方案:首次注册,没有验证邮箱,去邮箱按步验证,再次公布即可解决

November 27, 2020 · 1 min · jiezi

关于npm:bash-不是内部或外部命令也不是可运行的程序或批处理文件

windows下降级node.js, 在cmd 运行" n stable"报错"'"bash"' 不是外部或外部命令,也不是可运行的程序 或批处理文件。"windows下降级node.js, 在cmd 运行" n stable"报错"’“bash”’ 不是外部或外部命令,也不是可运行的程序 或批处理文件。在GitHub官网,搜寻gnvm,下载放在node.js的装置目录下 而后关上cmd命令行窗口,输出:gnvm update latest,期待更新。当然也能够间接笼罩.参考文章:https://jingyan.baidu.com/album/9158e000fc556ea2541228e2.html?picindex=1.

November 24, 2020 · 1 min · jiezi

关于npm:本地包调试-npm-link

引子再次碰到调试 npm 本地包的状况,一时想不起来,看了下文档,实际操作了一下,发现了一些文档上没明写的货色。 OriginMy GitHub介绍依据文档介绍,包的链接分为两步。 第一步在一个包文件夹内执行 npm link 将在全局文件 {prefix}/lib/node_modules/<package> 内,创立一个符号链接(symlink),这个链接指向 npm link 命令执行的中央。 第二步到其它目录下,执行 npm link packageName 命令,将会创立一个从全局装置的 packageName 到以后文件内的 node_modules 下的符号链接。 须要留神的的是, packageName 是取自包的 package.json 中 name 字段,不是文件夹名称。 包的名称可能有作用域前缀,如果有, packageName 也要对应加上。 实际基于文档,结合实际的操作,对照看下产生的成果。 运行环境我的项目是基于 webpack 简略配置,本地运行的 server 。node 应用 nvm 治理的。我的项目已援用了包,需在根底上进行批改调试。零碎是 macOS 。操作首先在包根目录上面执行 npm link 命令,呈现上面的提醒: 到对应的目录下,发现生成了提醒中所说的文件,就是文档中所说符号链接(symlink): 试着改了一下本地的源文件,发现全局包外面对应的文件内容也跟着变动。 而后到我的项目中执行 npm link packageName 指令,呈现了上面的提醒: 到 node_modules 下发现对应的依赖包曾经产生了变动: 这里的包跟全局那个生成的包是一样的,包更新了,本地看没什么成果,起因是本地的 sever 有缓存,须要重新启动一下。留神这个文件夹图标多了一个箭头的标记,未 link 之前没有这个。 ...

November 23, 2020 · 1 min · jiezi

关于npm:npm-发布包遇到的问题

引子尽管有公布过包的经验,但没有公布过本人的包,于是就参照 npm developer guide 尝试了一下,有了上面的播种。 OriginMy GitHub403 Forbidden依照文档中的步骤,注册登录后,筹备好了库,而后执行 npm publish,报了上面的谬误: Error: 403 Forbidden - PUT https://registry.npmjs.org/xx - You do not have permission to publish "xx". Are you logged in as the correct user?查问材料后,发现了这个 issue,原来是因为公开的库外面,曾经有了同名的库。因为是收费的账号,所以想在 npm 上发包,要么换个名称,要么花钱创立公有包。还有一种形式就是在内网搭建本人的服务。 Error: 402 Payment Required换了个名字,想起了本人见过的库,就模拟加了个 @ 前缀的包,再次公布的时候,报了上面的谬误: Error: 402 Payment Required - PUT https://registry.npmjs.org/@x... - You must sign up for private packages查看文档,发现 @npm/package-name 这种模式的包名,是有作用域的包名模式,执行 npm publish 的时候默认是公布公有的包。因而,第一种形式是花钱买公有包的服务,另外一种形式就是指定参数,示意公开: npm publish --access public须要留神的是这种模式的包名跟 npm 账户有对应关系,不能轻易填写。 ...

November 16, 2020 · 1 min · jiezi

关于npm:译npm-developer-guide

引子在 npm Getting started 之后,发现了 npm-developers 这篇文档,介绍从开始、本地测试、打包到公布的一个绝对残缺的流程。感觉是 Getting started 的一个补充,于是就把篇文档翻译成中文,加深下印象。 原文:npm-developers。 OriginMy GitHub简述所以,你曾经打算应用 npm 来开发(并且可能公布或部署)你的我的项目了。 太棒了! 在你的用户安装程序的简略步骤之上,您须要做一些事件。 对于这些文档这些是手册页。如果你装置了 npm,你应该能够在 npm 手册中找到特定主题的文档,或者通过 npm 帮忙来获取雷同的信息。 一个 package 是什么一个 package 是: 1. 一个蕴含了形容程序的 package.json 文件的文件夹。2. 蕴含有一个 gzip 压缩的压缩包(在 1 的根底上)。3. 一个解析为(2)中包的 url。4. 一个曾经在登记处公布的 <name>@<version>(在 3 的根底上)。5. 一个指向的(4)的 <name>@<tag>。6. 一个称心的有 “latest” 标签的 <name>(在 5 的根底上)。7. 一个克隆的 git 仓库链接,指向(1)中的文件夹。即便你素来没有公布过你的包,如果你只是想写一个 node 我的项目,或者在打包成压缩包后,你想在其它中央能很容易的装置,你依然能够从应用 npm 中受益匪浅。 Git 的链接可是上面的一些模式: git://github.com/user/project.git#commit-ishgit+ssh://user@hostname:project.git#commit-ishgit+http://user@hostname/project/blah.git#commit-ishgit+https://user@hostname/project/blah.git#commit-ishcommit-ish 能够是任何的 tag、sha 或者可能提供给 git checkout 作为参数的分支名。默认值是 master。 ...

November 9, 2020 · 2 min · jiezi

关于npm:npm-Getting-started

引子最近工作上要接触相干的货色,开始相熟文档,这里次要是 Getting started 局部中,感觉有帮忙的内容记录。 OriginMy GitHub组成npm 蕴含三个不同的局部: 网站命令行界面(CLI)登记处通过应用网站,能够查找发现包、设置简介、治理你的其它方面 npm 经验。比方,你能够建设 Orgs ,用来治理共有或公有的包。 命令行界面通过终端运行,这个是大多数开发者与 npm 交互的形式。 登记处是一个蕴含大量 JavaScript 软件和元信息的公开信息库。 注册依照提醒注册后,用 npm 测试登录。 npm login依据提醒输出帐号、明码、邮箱。输出后检测是否登录胜利 npm whoami如果显示出你的用户名,示意登录胜利。 配置本地环境对于 npm CLI 版本npm 命令行界面依照肯定的节奏失常公布。举荐装置的版本: latest release:最新的稳固版本。next release:最新的未公布的版本,行将成为最新版本。装置 Node.js 的时候,npm 会主动装置。然而 npm 的版本更新比 Node.js 频繁的多,所以装置最新稳固版本的 npm 指令如下: npm install npm@latest -g装置 next release 版本指令为: npm install npm@next -g须要留神的是,next release 版本蕴含的性能,在最新的稳固版本中不肯定会有。 装置强烈建议用 Node 版本管理工具来装置 Node.js 和 npm。不要应用 Node 装置工具,因为 Node 装置过程装置 npm 须要本地文件的容许,当运行全局 npm 包的时候可能会导致权限谬误。查看npm Node的版本 ...

November 2, 2020 · 1 min · jiezi

关于npm:npm-依赖管理中一些重要的细节

前言npm(全称 Node Package Manager,即“node包管理器”)是Node.js预设的、用JavaScript编写的包管理工具。尽管是Node.js中的工具,但当初更多的被用来配合前端构建工具给前端进行包治理。 作为一个包管理器,最重要的就是治理依赖了。对于简单的依赖树,npm 的解决机制和其余的包管理器会有所不同,本文将会具体介绍这些细节 npm2和npm3+版本对依赖的解决有所不同,但当初很少有应用npm3以下版本的我的项目了,本文中所有的介绍都是基于npm3+以上版本 npm 依赖管理机制npm 大体上来看,和其余的包管理器差不多,都是包依赖包,并且用版本号来申明这些依赖的包。 语义化版本号npm 中应用语义化版本来管制版本依赖包的版本,比方^~>=<之类的范畴符号,不过本文中版本号的解析形式不是重点,只须要晓得如果应用范畴版本号,npm会装置范畴内可用的最新版本**这里要吐槽一下npm的文档,光是找这个范畴版本号具体应用的版本策略,就找了很久,文档中并没有清晰的阐明……最初在npm update页面中找到了一丝介绍 If app’s package.json contains:"dependencies": {"dep1": "^1.1.1"} Then npm update will install dep1@1.2.2, because 1.2.2 is latest and 1.2.2 satisfies ^1.1.1. npm的这个范畴版本设计的理念还是挺先进的,通过范畴版本号让应用方能够及时的自动更新小版本,降级后可能修复一些bug,然而随之而来的也会有很多因更新导致的危险。毕竟版本号是人类管制的,人类管制就有可能呈现失误,比方一个订正版本号的更新中删除了某些api,导致无奈兼容 集体看来,这种范畴版本号的包管理机制,是弊大于利的,危险过高。如果在服务端场景下,什么都没改的状况下就偷摸换了个(小)版本,很可能会呈现一些重大的事变。一般来说,任何改变都须要通过测试,尤其是这种依赖包降级,是个挺有危险的事件。如果是那种通用根底包的危险就更大了,援用的中央过多,很可能呈现一些不兼容的状况。 依赖树和传递依赖npm 会默认会将传递依赖的包用flat的模式,也装置至node_modules的根目录,比方有一个模块A,他依赖了模块B:** 版本抵触当初减少一个模块C,C也依赖B,然而C依赖了B的高版本V2.0,此时npm的解决就有点不一样了;因为C依赖的B模块版本和A依赖的B版本不兼容,npm 会先将A模块依赖的B1.0装置至根目录,而后将C依赖的B2.0装置至C本人的node_modules中,如下图所示目录构造 |————mod-A@1.0|————mod-B@1.0|————mod-C@1.0 |————mod-B@2.0对于版本不兼容的依赖树,npm的解决是先查看是否版本兼容,如果版本兼容就不反复装置,如果和之前的的传递依赖包版本不兼容,那么就将该依赖包装置至以后援用的包的node_modules下**npm 的包版本抵触解决方案尽管带来了包文件的 冗余,但能够很好的解决抵触问题 这种版本抵触解决机制真的很完满吗?素来面的介绍能够看出,当呈现版本不兼容时,npm会将依赖的包装置至以后包的node_modules下,有点submodule的意思,但也不是真的十拿九稳,还是有可能呈现因为多版本共存导致的抵触。 还是拿下面的A/B/C三个依赖模块来举例,比方B v1.0中向window对象注册了一个属性,B v2.0也向window中注册了一个属性,因为B v1.0和v2.0差距很大,尽管注册的是同一个对象,但属性和其函数差距很大,当一个页面同时引入A和C模块时,B v1.0和B v2.0都会加载,可能会呈现一些意外的谬误。对于使用者来说是不能承受的 下面这个例子可能还不是很失当,因为注册window这件事原本就有肯定危险。当初构想另一种常见的场景,比方有在Angular(2)中,两个基于Angular的组件依赖了不同的Angular(Core)大版本,那么当一个页面同时应用两个组件,并且两个组件须要在以后页面进行交互时,比方赋值或者函数调用之类,就很容易呈现上图中的问题。 这种问题在Java生态中的包治理尽管也有,但模式会有所不同: 在Maven中(Java生态的包管理工具),尽管依赖是树状构造的,但构建后的后果其实是立体(flat)的的。如果呈现多个版本的jar包,运行时个别会将所有jar包都加载;不过因为JAVA中ClassLoader的parent delegate机制,同样的Class只会被加载一次,下N个Jar包内的的同名类(包名+类名)会被疏忽,这样的益处是简略,如果呈现版本抵触也清晰可见,抵触问题须要使用者自行处理。 Maven Build对包(传递)依赖多版本的解决,如下图所示:npm 对于这种可能呈现的版本抵触问题,也提供了一个解决办法:peerDependencies peerDependenciespeerDependencies和maven中的provide scope很像,当一个依赖模块X定义在peerDependencies中而不是devDependencies或dependencies中时,依赖该模块的我的项目就不会主动下载该依赖。 我的项目中须要间接或间接的申明合乎该版本的依赖,间接依赖是指间接在devDependencies或dependencies中申明,间接依赖是指以后我的项目依赖的其余模块依赖了X合乎版本范畴的模块,如果二者都不满足,在npm install时会呈现一个告警,比方: npm WARN hidash@0.2.0 requires a peer of lodash@~1.3.1 but none is installed. You must install peer dependencies yourself.npm & webpack当初很多我的项目都会应用webpack来作为我的项目的构建工具,然而和java中的maven 不同,webpack和npm是两套独立的工具,构建和包治理是离开的 ...

October 25, 2020 · 1 min · jiezi

关于npm:独家下载Java工程师成神之路基础篇

简介: 初学Java的你还在懊恼不晓得怎么去学,学习什么内容吗?那么多的技术书籍是否曾经让你无从下手?别急,来看这一份残缺的Java学习门路。 复制该链接到浏览器实现下载或分享:https://developer.aliyun.com/topic/download?id=923初学Java的你还在懊恼不晓得怎么去学,学习什么内容吗?那么多的技术书籍是否曾经让你无从下手?别急,这就附上一份残缺的Java学习门路。从头开始,给你一个体系化的学习计划。联合作者多年开发教训,倾心五年积淀,旨在与泛滥Javaer互相交换,共同进步。 《Java工程师成神之路(根底篇)》介绍了一般Java工程师必须要学习的相干知识点,包含面向对象和Java语言根底两大部分,涵盖根本数据类型、关键字、异样、I/O流、汇合、反射、泛型和枚举......另外,内附成神导图哦~ [收费下载《Java工程师成神之路(根底篇)》](https://developer.aliyun.com/... 对于作者:Hollis ,阿里巴巴技术专家,51CTO 专栏作家,CSDN 博客专家,掘金优良作者,《程序员的三门课》联结作者,《Java 工程师成神之路》系列文章作者;热衷于分享计算机编程相干技术,博文全网浏览量数千万。 目录 精彩节选Java如何实现的平台无关性的置信对于很多Java开发来说,在刚刚接触Java语言的时候,就据说过Java是一门跨平台的语言,Java是平台无关性的,这也是Java语言能够迅速崛起并景色有限的一个重要起因。那么,到底什么是平台无关性?Java又是如何实现平台无关性的呢?本文就来简略介绍一下。 什么是平台无关性平台无关性就是一种语言在计算机上的运行不受平台的束缚,一次编译,到处执行(Write Once ,Run Anywhere)。 也就是说,用Java创立的可执行二进制程序,可能不加扭转的运行于多个平台。 平台无关性益处作为一门平台无关性语言,无论是在本身倒退,还是对开发者的友好度上都是很突出的。 因为其平台无关性,所以Java程序能够运行在各种各样的设施上,尤其是一些嵌入式设施,如打印机、扫描仪、传真机等。随着5G时代的降临,也会有更多的终端接入网络,置信平台无关性的Java也能做出一些奉献。 对于Java开发者来说,Java缩小了开发和部署到多个平台的老本和工夫。真正的做到一次编译,到处运行。 平台无关性的实现对于Java的平台无关性的反对,就像对安全性和网络移动性的反对一样,是散布在整个Java体系结构中的。其中扮演者重要的角色的有Java语言标准、Class文件、Java虚拟机(JVM)等。 编译原理根底讲到Java语言标准、Class文件、Java虚拟机就不得不提Java到底是是如何运行起来的。 咱们在Java代码的编译与反编译那些事儿中介绍过,在计算机世界中,计算机只意识0和1,所以,真正被计算机执行的其实是由0和1组成的二进制文件。 然而,咱们日常开发应用的C、C++、Java、Python等都属于高级语言,而非二进制语言。所以,想要让计算机意识咱们写进去的Java代码,那就须要把他"翻译"成由0和1组成的二进制文件。这个过程就叫做编译。负责这一过程的解决的工具叫做编译器...... 原文链接本文为阿里云原创内容,未经容许不得转载。

October 23, 2020 · 1 min · jiezi

关于npm:MQTT在游戏运营发行中的实践

前言在游戏生态中,次要蕴含游戏的研发方以及经营发行方。一款游戏的运行,分为研发和经营两个阶段。研发的主体有集体、独立工作室、游戏研发公司等; 游戏的研发主体专一于游戏内容的研发,对游戏的发行及经营往往在人力、财力上投入有余,促使游戏发行及经营业务应运而生,产生了独立的经营发行方。目前市场上很多大型游戏厂商将本人的发行及经营能力打包给经营发行方。另外还有一些游戏的散发渠道方,依靠于本人的流量劣势,也提供仅针对本渠道的联结经营服务。上图中无关的交互的局部: l 游戏自身的操控交互是在游戏客户端与游戏服务端间进行的,大部分会采纳Socket长链接的形式进行通信。l 游戏客户端与游戏发行方平台的交互,包含登录,领取等等,这些由游戏玩家被动申请的会采纳http的形式进行链接通信。这两局部的交互选型绝对固定。但在经营发行方中对于经营音讯以及广告推送等场景,例如各类服务器运维降级等跑马灯信息;账号踢下线信息;悬浮窗广告;一般音讯推送等等服务更多是由游戏的经营发行方被动推送的。在百万级游戏客户的状况下,如何抉择更适宜的交互方式是一件头痛的事件。 咱们在本章中探讨如何更好地抉择经营发行音讯的技术实现。 经营发行方推送的特点与要求1.触达用户多:一款胜利的游戏总客户数常常超百万千万。同时在线数高。2.音讯的时效性不同:有些音讯是在某时间段内都失效的(例如主游戏服运维降级告诉),无论客户以后的状态是否在线,如果以后客户在线那么就立即收到,离线的客户在下次进入游戏时也会收到相应的音讯。有些音讯是对于以后在线的客户(例如账号踢下线信息)才有意义。3.精准的群发性诉求:推送的音讯都是对于具备某类特色的客户群体进行播送(例如不同的广告对应不同等级的游戏玩家)4.连贯的轻量级耗费:这类数据的交互比照游戏自身操控来说,频率较低,所以游戏客户端与广告经营等数据推送的流量占用的客户端运行资源尽可能的少。5. SDK依赖资源简洁:在游戏畛域里,由研发团队会产生游戏母包,而经营发行方会在母包的根底上嵌入经营所须要的SDK包,例如领取性能, 数据推送性能;那么对于推送性能自身所依赖的资源包就越小越好了。 备选的技术计划剖析1. http轮询计划: 长处:游戏客户端依赖起码,实现不便。毛病:有效轮询占比高:多个客户端,多品种的轮询多,鉴于本类音讯的频率不高,那么绝大部分轮询都是没有理论业务意义的。经营端实现简单:须要应用额定的代码逻辑专门保护已读取状态。资源占用高:周边配套的调用链,日志信息,并发解决能力这些推高了资源占用状况。 2. Socket计划: 长处:游戏客户端依赖比拟少,实现不便。毛病:连贯保护:经营方会有不同种类型的利用划分(例如广告可能是独自的利用,系统管理也会是另一独自的利用),如果都须要推送,那么就必须有不同的socket连贯到不同类型的利用;这样游戏客户端的连贯就会增多,从而占用比拟多的资源。经营端实现简单:须要应用额定的代码逻辑专门保护订阅推送类型,在推送过程中须要代码实现过滤,精准投递到目标群体; 为了保障推送的品质(达到与否),须要额定记录推送状态;对于推送数据的时效须要额定的管制,有些过期的音讯(例如服务运维工夫告诉)。 3. KAFKA计划: 长处:接入简略:成熟的消息中间件,反对各种实现语言。只须要对接Kafka 节点自身,不须要间接与发行方的利用进行连贯,人造解藕。功能强大: 推送数据的状态保护,存储等都能够借用Kafka的来提供。毛病:客户端连接数反对有余,无奈通过简略的集群来反对数量泛滥的游戏玩家(客户端)。 4. MQTT计划: 长处:接入简略,MQTT的协定十分简洁,反对各种实现语言。反对各种订阅关系。反对p2p音讯。反对各种音讯触达的QoS品质。可观测客户端的连贯状况。反对百万级的连贯。毛病:MQTT技术以后阶段不如其它计划公众。 MQTT技术计划通过比照,下面的三种计划, MQTT计划是十分合乎作为游戏的经营发行方与游戏客户端进行推送数据的交互场景。那么咱们来看看这个技术的设计准则。 1、轻量级与高效的微音讯,MQTT协定精简,音讯头特地简略; 2、基于公布/订阅(Pub/Sub)通信模式,能够进行双向通信;3、反对topic进行音讯存储落盘;4、反对订阅关系设定;反对p2p的模式与播送模式;5、反对百万级别的连贯设施;6、提供音讯服务质量治理;7、实用于低带宽、高提早、不稳固的网络;这里,咱们比拟一下阿里云的产品微音讯队列MQTT与开源MQTT。 结语在游戏公布经营平台中,应用阿里云微音讯队列MQTT产品能够满足经营平台与游戏客户端间的数据推送服务场景,即既保证了百万级连贯,又实现了资源占用少,也能做到各种简单的音讯数据公布订阅管控。 原文链接本文为阿里云原创内容,未经容许不得转载。

October 23, 2020 · 1 min · jiezi

关于npm:过Serverless技术降低微服务应用资源成本

前言在大型分布式IT架构畛域,微服务是一项必不可少的技术。从实质上来讲,微服务是一种架构格调,将一个大型的零碎拆分为多个领有独立生命周期的利用,利用之间采纳轻量级的通信机制进行通信。这些利用都是围绕具体业务进行构建,能够独立部署、独立迭代,也可能依据业务负载独立的程度扩大。微服务思维以及相干的技术为IT架构的倒退带来了一系列粗浅的改革:1、 易于开发和保护:一个利用只会关注一组特定的业务性能,通过服务拆分,能缩小利用之间的耦合度,让开发和保护更加简略。2、 技术栈不受限制:在微服务架构中,能够联合我的项目业务及团队的特点,正当的抉择技术栈。3、 放慢零碎演进速度:每一个利用都能够独立的进行版本更新,通过灰度公布等技术手段能确保公布过程中整个零碎稳固运行。4、 突破性能瓶颈:每个利用都能独立的程度伸缩,使零碎性能能够依据计算资源的减少而失去线性的扩大。 微服务的挑战世上没有收费的午餐,微服务技术让IT零碎变得更麻利、更强壮、更高性能的同时,也带来了架构复杂度的晋升。对于开发者而言,要想更好的驾驭微服务架构,须要解决继续集成、服务发现、利用通信、配置管理、流量防护等一系列难题。侥幸的是,针对这些普遍存在的难题,业界涌现了一系列优良的开源技术组件和工具,让开发者能够更轻松的构建微服务利用。像Spring Cloud和Dubbo这样的技术框架,通过多年的倒退,曾经演变为微服务畛域的通用规范,极大地升高了微服务的门槛,但这些技术框架仍然没有方法解决其中两个最大的挑战,这两个挑战成为摆在开发者背后的两座大山。 挑战一亟需欠缺的生命周期治理与服务治理计划:在一个频繁迭代的零碎中,每个利用会经常性面临新版本公布需要,须要对利用的上线、下线、更新、回滚等流程进行集中性的治理,并配合精密粒度的灰度公布伎俩,缩小版本迭代对业务造成的影响。在一个简略的微服务架构中,如果某利用处于整个链路的入口地位,它的前端个别会挂上负载平衡组件(上图中的利用A),以承接来自于最终用户的业务申请。这类利用在进行生命周期治理的时候,复杂度会更高,为了确保利用在新版本公布过程中的均衡稳固,会通过如下的步骤:在这个流程中,还没有波及到对于流量精密粒度管制的高级灰度计划,但曾经足够体现出其复杂性和操作难度了。如果仅仅依赖于简略的公布脚本进行治理,岂但效率很低,还很容易导致顾此失彼,对系统稳定性造成微小的危险。 挑战二亟需欠缺的程度扩容与缩容计划:当某一个利用的性能呈现瓶颈,须要通过减少实例数量来进行性能晋升的时候,就须要引入新的计算资源。新的计算资源从何而来呢? 对于线下IDC而言,计算资源是须要事后布局的,扩容并不是一件简略的事件,可能会因为各种条件的制约而导致扩容无奈实现。当然这种困扰在云计算时代不复存在了,为一个利用裁减计算资源是信手拈来的事件,但光有计算资源是不够的,还得在下面部署利用,并将利用包容到微服务体系中。依据这个流程,如果须要扩容一个利用实例,激进预计也须要20分钟以上,其中购买、零碎初始化、利用部署都须要占用大量的工夫。假如零碎流量突增,须要在2分钟之内紧急扩容,这个计划就无用武之地了。 一剂良药:容器化技术为了解决这两个难题,开发者们尝试了各种各样的计划,新的理念以及技术框架在过来的这五年层出不穷。在一轮轮的优胜劣汰下,以Docker为代表的容器技术,在Kubernetes生态的撑持下,在业界成为了支流,是构建云原生(Cloud Native)利用的必备因素。容器化相干技术可能更大程序的开掘云计算的价值,在肯定水平上帮忙开发者解决这两个难题。 在利用生命周期治理以及服务治理方面,Kubernetes提供了比较完善的实现机制,通过构建Deployment资源,配合proStop和postStart脚本,能比拟不便的实现滚动公布以及利用的优雅高低线。尽管在灰度公布的过程中,仍然没有方法间接对流量进行精密粒度管制(引入ServiceMesh技术能加强流量控制力,不在本文探讨范畴),但相比简略的公布脚本,曾经有了飞跃性的晋升。 在利用的程度扩容与缩容方面,通过容器化技术能够极大水平的缩小操作系统装置以及零碎级初始化的工夫,但购买虚拟机的操作是无奈防止的,所以在零碎遇到流量增突的时候,仍然没有方法实现疾速程度扩容。 咱们能够预留一部分计算资源,放在资源池中,当利用有扩容需要的时候,就向资源池申请资源,当业务负载降落的时候,再把多余的计算资源偿还到资源池中。 这其实并不是一个好主见,每一个计算资源都是须要老本的,资源池尽管可能解决计算资源疾速投入使用的问题,却造成了微小的节约。另外,到底布局多大的资源池,也是一件很伤脑筋的事件,池子越大,造成的节约就越大,但池子太小,又可能满足不了扩容的需要。 资源老本更深层次的剖析可能有的开发者会认为,目前的业务运行十分的稳固,在用户流量上并不存在显著的突增,所以扩容和缩容是一个伪需要,在未来也不会有这样的需要。这可能是对互联网业务的一种误会,因为齐全没有扩容需要的状况是不存在的。 首先,只有一个零碎是为人服务的,就必然存在波峰和波谷。对于一个7*24小时运行的零碎,不可能永远放弃同样的用户流量,二八准则对于很多业务零碎仍然实用(80%的用户流量集中在20%的时间段。即使是用户流量绝对均衡的零碎,在凌晨也存在流量的低谷,如果能更进一步的开释闲置计算资源,晋升资源利用率,就能显著的升高资源应用老本。另外,相比生产环境,开发和测试环境对于扩容和缩容的需要会更加迫切。一套微服务利用由不同的团队进行开发,在现实的状况下,多个团队会共享一套测试环境:然而,每个团队对于利用的迭代都会有本人的节奏,与此同时,他们又想领有独立的端到端测试环境,从而实现环境之间的隔离,以防止团队之间的相互影响。这样的话,很有可能会造成多套测试环境: 随着利用、团队、业务性能点数量的减少,所须要的开发测试环境数量还会成倍的增长,造成微小的资源节约。对于测试环境的计算资源而言,资源利用率要远低于生产环境。有的时候仅仅是一个简略性能点的验证,为了端对端的跑通业务性能,又防止团队之间的相互影响,就会开启一套包含全副微服务利用的新环境。这样的资源节约,对于很多企业,都是一个多年都未曾失去解决的难题。 因而,微服务架构在实质上就是对弹性伸缩有着强烈诉求的,在弹性伸缩的过程中,不论是单利用的程度弹性伸缩,还是整套环境的启停,资源利用率都对最终的资源老本起着决定性的作用。如果能想方法晋升资源利用率,就能为企业节俭大量资源老本。值得咱们器重的是,绝大多数的微服务利用的资源利用率都是非常低的。咱们能够做一个简略的统计:把所有服务器的CPU利用率每5分钟导出一次,依照天的维度求平均值,就能从整体上理解零碎的资源利用率数据。如果把开发测试环境的服务器资源也纳入统计的范畴,资源利用率很有可能会更低。 Serverless化摸索资源利用率低的根本原因,在于以服务器为载体的利用架构中,开发者须要将构建好的程序包部署到服务器上,从而对多个用户事件进行响应。为了确保事件响应的及时性,须要让程序长驻于服务器上,而且尽可能激进的布局资源,以避免出现负载过重而导致服务解体的状况。在这个过程中,理论的负载在工夫上调配并不平衡,从而导致整体的资源利用率偏低。 Serverless技术的呈现,为晋升资源利用率提供了新的思路。Serverless是一种构建和治理基于微服务架构的残缺流程,容许开发者脱离服务器资源而间接部署利用。它与传统架构的不同之处在于,齐全由第三方治理,由事件触发,存在于无状态(Stateless)的计算容器内。构建无服务器应用程序意味着开发者能够专一在产品代码上,而无须治理和操作服务器资源,真正做到了部署利用无需波及基础设施的建设。 Serverless技术存在多种状态,最典型的一种是FaaS(Function as a Service,函数即服务),比方阿里云的函数计算(Function Compute,FC)产品。在函数计算畛域,所有计算资源的申请和调度都由具体的业务事件触发,当业务事件所对应的工作实现之后,计算资源会被立刻开释。这样的形式真做到了计算资源的按需分配,能显著晋升资源利用率,是Serverless技术的终极状态。 另外一种是Serverless化的容器技术,Serverless化的容器实例运行在案例隔离的环境中,每个计算节点通过轻量级虚拟化平安沙箱技术齐全强隔离。对于使用者而言,无需购买服务器资源即可间接部署容器利用,也无需对集群进行节点保护和容量布局,能够依据利用配置的CPU和内存资源量进行按需付费。当微服务利用须要扩容的时候,就能够疾速取得计算资源,不须要再通过购买服务器这个步骤了,能够帮忙开发者升高计算成本,缩小闲置资源节约,平滑应答突发流量顶峰。阿里云的Serverless Kubernetes(ASK)就是Serverless化容器技术的代表产品。 更进一步挖掘开发者的诉求Serverless技术无缝是云计算和云原生利用架构的倒退方向,但对于微服务利用的开发者而言,不论是FaaS状态,还是Serverless Kubernetes,都存在肯定的局限性。 不是每一种业务都适宜通过FaaS的形式进行构建,特地是对于链路长,上下游依赖特地显著的利用,基本没有方法进行FaaS化革新。即使某些业务零碎的FaaS化革新被证实可行,把现有的微服务架构革新成FaaS架构也须要肯定的工作量,并不能做到无缝移植。 Serverless Kubernetes架构尽管能适配所有的业务场景,但对于开发者而言,构建一整套Kubernetes体系,须要把握一系列跟Kubernetes相干简单的概念,有着十分陡的学习曲线。而且Kubernetes生态中各种组件的搭建,再加上网络层与存储层的适配,都波及非常复杂的工作。 造成这种局限性的起因很简略,在以Spring Cloud为代表的微服务技术营垒中,零碎的构建都是围绕着利用(也能够了解为单个的服务)而开展,不论是版本更新还是程度扩大,都是针对利用自身。Serverless Kubernetes架构的外围在于Pod,比利用更偏差零碎底层,所以使用者须要投入更多的精力用于利用上层资源的治理。而FaaS架构的外围在于函数,比利用更偏差零碎下层,因而灵便度会升高,不能适配所有的业务场景。 对于应用支流Spring Cloud体系或Dubbo体系构建微服务利用的开发者而言,如果须要引入一种计划升高资源老本,他的最终诉求肯定蕴含两个方面: 1、 是否0革新老本,或者靠近0革新老本。2、 是否适配所有的业务场景。 应用层Serverless技术是否有一种介于FaaS和Serverless化容器之间的技术,能够实现上述重要诉求呢?当然有,这就是以阿里云Serverless利用引擎(SAE)为代表的应用层Serverless技术。 图:不同层级的Serverless技术 SAE实现了Serverless 架构 + 微服务架构的完满交融,对于Spring Cloud和Dubbo等支流的微服务架构,能够实现无缝兼容,基本上没有革新老本,并真正按需应用、按量计费,节俭闲置计算资源,同时免去 IaaS层运维方面的工作,无效晋升开发运维效率。 以Spring Cloud利用为例,如果须要部署一个新的利用,只须要2个步骤:1、 通知SAE这个利用须要多少个实例,并指定每个实例须要的CPU/内存规格。2、 上传利用的JAR包/WAR包,并启动利用。 咱们发现,这2个步骤中并不波及容量评估、服务器购买、操作系统装置、资源初始化等工作,就能让蕴含多个对等实例的微服务利用运行起来。这是因为在Serverless的世界中,不再具备服务器资源这样的概念,利用的载体是SAE调度进去的沙箱容器,每个实例只有在真正投入使用后,才会按应用时长进行计费。 对于开发者而言,他们不必关怀利用到底部署在物理机外面,还是虚拟机外面,或是容器外面,也不须要晓得底层的操作系统是什么版本的,只须要关注每个利用实例占据多少运算资源就能够了。如果利用须要从4个实例扩容到6个实例,或者缩容到2个实例,只须要一个指令就能够实现,甚至与SLB的绑定关系,都能够主动的建设或解除,这是Serverless技术为开发者带来的微小价值。 应用SAE部署微服务利用,因为只是变更了利用运行的载体,所以能够100%的兼容现有的技术架构和业务性能,迁徙老本能够忽略不计。 SAE的极致弹性能力除了手动的扩缩容指令,SAE还反对2种主动弹性机制,能够对微服务利用进行灵便的程度扩大,更进一步的施展云计算的弹性能力。 1、 定时弹性机制:对于会预期产生的周期性行为,能够设置定时弹性策略。举例:如果每天的上午9点是业务顶峰,能够定时每天8点半减少实例数量,并在9点半缩小实例数量。2、 基于指标阈值的弹性机制:对于超出预期的业务流量突增,能够设置基于指标阈值的弹性策略,依据CPU、内存等资源指标,以有QPS等业务指标让利用实现主动的弹性缩。 通过多种弹性机制,可能对系统容量进行精密粒度的治理,使资源的使用量能随着业务流量的变动而调整,从而极大水平的减少资源利用率,大幅升高资源老本。 在计算资源的调度和启动上,SAE做了多项优化,对于扩容进去的新实例,只须要几秒钟的工夫就能拉起,这项能力对于一些须要紧急疾速扩容的突发场景,是具备重大意义的。 对于开发测试环境而言,SAE的机制弹性能力能体现得更加酣畅淋漓,得益于SAE杰出的资源调度能力,能够一键启停一整套微服务利用。即使仅对一项简略的新性能进行冒烟测试,也齐全能够新启一套残缺而隔离的测试环境来进行。新的环境能够在秒级搭建实现,疾速投入使用,而测试结束后,又能够立刻开释。从老本上来讲,一套新环境理论投入使用的工夫很短,因而只会耗费极少的费用。这对于微服务利用开发过程中的多团队合作,是一个微小的改革。 老本剖析SAE通过资源的理论使用量来付费,费用由两局部组成,每局部依据统计后果和计算形式进行费用结算,按小时出账单扣款。每个利用应用的资源计量形式如下所示: ...

October 19, 2020 · 1 min · jiezi

关于npm:进击的数据中台企业数字化转型的新引擎

经验过“追捧”和“质疑”等种种考验后,以后,数据中台曾经走到验证其价值的要害路口。 数据中台是企业数字化转型新引擎在人工智能、大数据等技术倒退和企业数字化转型减速的双重驱动下,2019年,数据中台在泛滥赛道中怀才不遇,成为行业焦点。除了提供综合解决方案的行业元老阿里巴巴之外,专一于某一具体场景的中台服务商,以及转型中的CRM、ERP等企业也纷纷入场,市场竞争愈发强烈。 公众对数据中台、数据平台、数据仓库等概念的辨析与了解存在的偏差,肯定水平造成了对“数据中台”概念的质疑和误读。 那么,到底什么是数据中台?依据36氪研究院公布的《2020年中国服装行业数据中台钻研报告》(以下简称为“《报告》”),数据中台概念最早由阿里巴巴团体提出,是方法论、组织与工具的有机联合,是快、准、全、统、通的智能大数据体系。与数据仓库等传统数据工具相比,数据中台是一种新的理念,以“技术+业务”为双驱动,是企业发展新型经营的中枢系统。 图示:数据中台与数据仓库的区别 据《报告》钻研剖析,数据中台对优化企业组织构造与流程,晋升企业管理水平和组织麻利度具备较强推动作用。这是因为,数据中台突破了传统企业组织架构下IT和业务只能分属不同部门的藩篱,将业务与技术交融协同,省去业务数据跨部门传递步骤,同时将基于技术的数据分析后果间接转化为业务优化计划,如此一来,能够实现1+1>2的成果。 图示:数据中台赋能企业组织敏捷性 以后,随着数智化落地过程逐渐深刻,企业对数据价值开掘和深刻业务层的数据利用需要一劳永逸,数据中台解决方案也随之迭代降级。以阿里云数据中台为例,基于不同行业的数据个性和差异化的业务逻辑,阿里云数据中台正在从通用畛域走向精细化垂直畛域。 数据中台重塑服装行业价值链以服饰这一垂直行业为例,数据中台买通本来涣散的企业价值链各环节,基于强有力的数据,输入多元简单业务场景下的无效解决方案,推动企业数智化的切实落地。在新冠肺炎疫情阴云笼罩寰球的背景下,企业数智化转型更具现实意义,数智化水平高的企业往往领有趁势而为、戗风翻盘的高效应变能力。 然而数智化对于服装行业而言,却是一个稍显难堪的命题:最早试水,却涉“水”未深。服装企业较早地将数字化管理工具利用在客户、库存治理方面,海量经营数据散落在并未互通的数字零碎中,由此引发的数据孤岛效应减弱了数据反哺业务增长的能力,更无需言数据与企业组织及生态的联动。 此时,数据中台的价值便得以彰显。数据中台突破企业数据烟囱,实现数据的对立收集、贮存、计算、可视化出现。服装企业设计生产、库存、铺货、补货、清尾各环节均实现数据加持,扭转过来企业经营管理决策的"拍脑袋"、"靠教训"模式,"让数据谈话",推动人、货、场三要素的智能匹配。 图示:数据中台优化企业价值链 《报告》详述了数据中台赋能服装企业的五大利用场景: 新品孵化、供应链革新、全域营销、门店治理及渠道拓展,笼罩了服装企业的经营日常。 新品孵化:数据中台加持下,生产数据低时延传输至企业,造成全方位的市场画像,反对企业在新品孵化方面贴近消费者需要,缩短孵化周期,及时无效适应市场新需要,打造“爆款产品”。 供应链革新:数据中台将企业数据打造成数据资产,反哺供应链各环节。长久以来,产业链的库存环节与服装企业“相爱相杀”,企业须要弱小的库存来应答市场需求,然而稍有不慎产生的库存积压将形成企业难言之痛。数据中台疏导企业基于生产及市场数据,剖析、预测需要总量,“以需定产”,破解由库存积压导致的企业财务、治理难题,直击库存痛点。 全域营销:数据中台框架下,企业对生产群体实现更为粗疏的划分,针对不同细分群体及其生产特点,定制个性化营销计划,实现营销的精准触达,带动消费者的拉新、转化、促活与裂变。 门店治理:数据中台对门店的赋能成果体现在新店选址与门店智能化经营两方面。新店选址抓住消费者的“人”,智能门店抓住消费者的“心”,最终晋升门店坪效与人效。 渠道拓展:对服装企业而言,得渠道者得天下。渠道意味着流量与业务后劲。数据中台助力企业摸索线上渠道的同时买通线上线下数据,打造全渠道消费者增长闭环,借助精准全域营销,进步消费者的品牌粘性。 数据中台对服装企业的赋能场景,同样实用于业务逻辑类似的新批发行业,其利用价值在于使企业更懂市场,以数据资产驱动业务增长,打造企业外围竞争力。 市场探路者:阿里云数据中台数据中台赛道炽热的背地离不开阿里对数据中台的元老级奉献。作为这一行业的先行者和领路人,阿里云数据中台全面定义数据中台这一概念,将阿里团体外部中台实际的教训累积与各行业倒退特色有机联合,摸索出具备行业特色的数据中台建设门路。 以“OneData方法论”为内核+“Dataphin基座+Quick系列场景化”工具,再加上企业外部业务与IT职能交融下的组织治理新模式,形成阿里云数据中台输入计划的灵魂。 图示:阿里云数据中台外围产品矩阵 “OneData”方法论领导企业数据资产的构建与治理,打造松软的数据根底;Dataphin作为数据中台建设的基座,“Quick系列”产品则为数据与业务场景联合提供利用工具。“Quick系列”继续丰盛与迭代,为行业场景化提供更具针对性的领导。 值得一提的是,阿里云数据中台的外围产品之一——Quick BI,是中国惟一入选Gartner魔力象限的可视化剖析产品,阿里云弱小的底层技术积淀不容小觑。 与行业其余玩家相比,阿里云数据中台推动企业生态与阿里团体生态联动,实现360°全域数据整合,成为企业可继续倒退的无力引擎。 只管数据中台行业处于倒退初期,渗透率有待晋升,质疑与激励声音并存,但在风起云涌、疾速倒退迭代的市场竞争环境中,数据中台赋能企业的价值日益凸显,行业拐点将至,将来可期。 原文链接本文为阿里云原创内容,未经容许不得转载。

October 16, 2020 · 1 min · jiezi

关于npm:阿里云DNS-新增云上线路的智能解析功能

简介: 企业在云上部署单元化架构或外部服务链路时,须要思考让数据(单元)离用户更近,防止跨单元获取数据,以此来满足本身低延时的诉求。阿里云DNS 新增基于云上链路的调度性能,进一步优化DNS智能解析,给云上用户提供更精准的流量调度能力。 传统解析 VS 智能解析咱们晓得,传统DNS解析形式,无需判断访问者起源,会随机抉择其中一个IP地址返回给访问者。然而,这样的形式,曾经不能满足现今互联网用户的拜访需要。因而,DNS智能解析应运而生。 阿里云DNS采纳的就是智能解析形式,它能够通过判断访问者的起源,为不同的访问者智能返回不同的IP地址,将申请调度到离用户最近的服务器节点,可能缩小解析时延,达到晋升网站访问速度的效用。 线路丰盛、流量调度精准的阿里云DNS智能解析性能,就可能帮忙云上用户实现就近接入。同时,智能解析还实用于以下场景: 境内跨运营商或跨地区拜访场景:企业的线上应用服务,大多数都会应用多个运营商IP地址,通过DNS智能解析的配置来实现用户的就近拜访。寰球业务智能拜访场景:企业如果是发展寰球业务,个别为了实现寰球用户都能取得较好的拜访品质,通常会在中国和海内别离部署应用服务,通过智能解析的配置,企业能够实现将用户拜访别离路由至海内或境内的接入点。通过智能解析限度某运营商或地区的访问者进行拜访:一部分企业因某些起因,会冀望限度境外的访问者拜访企业的应用服务,那么则能够通过配置智能解析,来实现屏蔽境外访问者的拜访诉求。智能解析-新增“阿里云”线路在云下丰盛的运营商网络线路根底上(比方 中国联通/中国电信/中国移动/中国教育网/鹏博士等),为了可能给云上的用户提供更精准的流量调度能力,阿里云DNS智能解析性能新增了“阿里云”线路,推出基于阿里云Region链路的流量调度计划。 新增的“阿里云”线路为企业用户提供更精密粒度、更精准的基于阿里云Region内的流量调度解决方案,反对云上用户实现依照Region就近接入,以及实现依照Region维度对阿里云进口的拜访流量进行调度调配,可能针对不同Region的访问者,返回指定的IP地址,使云用户疾速连贯云资源,实现升高解析提早与流量调度。 此次新增的“阿里云”线路,如下:华北1 (青岛)、华北2 (北京)、华北3 (张家口)、华北5 (呼和浩特)、华东1 (杭州)、华东2 (上海)、华北6(乌兰察布)、华南1 (深圳)、华南2 (河源)、华南3 (广州)、东北1(成都)、中国(香港)新加坡、澳大利亚(悉尼)、马来西亚(吉隆坡)、印度尼西亚(雅加达)、日本(东京)、德国(法兰克福)、英国(伦敦)、美国(硅谷)、美国(弗吉尼亚)、印度(孟买)、中东东部1(迪拜) 用户能够通过配置DNS记录的“解析线路”来抉择阿里云的region线路(图1):图 1 配置阿里云 华东1(杭州)解析线路 新增“阿里云”线路前后,成果比照咱们能够通过两张比照图,来看一下新增的“阿里云”线路所起到的作用。图 2 新增“阿里云”线路-前 上图中,是新增“阿里云”线路之前的解析过程。咱们能够看到: 在这种状况下,依据用户所在运营商或区域创立流量调度规定,咱们将图中的电信北京用户的流量同时指向阿里云华北2(北京)和电信(IDC北京)的IP,即50%的流量调度到阿里云华北2(北京)线路,另外50%调度到电信(IDC北京)线路。在此场景下,阿里云DNS未提供“阿里云”线路时,无奈精确地将阿里云上用户的DNS申请,精准调度到阿里云华北2(北京)的IP上,阿里云北京用户的流量,只能被调度到默认线路,即联通(IDC北京)上,这样对于阿里云北京的用户,无奈实现就近接入。图 3 新增“阿里云”线路-后 这张图中,是新增“阿里云”线路之后的解析过程。咱们能够发现: 推出流量调度计划后,云上用户能够被精准调度到其对应的区域线路上(比方阿里云北京用户,能够精准调度到阿里云_华北2(北京)线路),此时的电信北京用户,也齐全调度到电信_北京线路上,这样就实现了依照Region就近接入,更大程度地防止了调度跨区景象的产生。基于Region的流量调度计划的劣势由此可见,更加丰盛的线路,实现了Region维度的流量精准调度,从而解决解析提早、拜访速度慢等问题。同时,流量调度计划具备如下劣势: 流量拆分更精密,可能精密到对阿里云进口流量做流量调配,实现云上用户的就近接入。流量调度更精准,可能实现阿里云Region内的流量闭环,便于企业构建单元化架构。流量拜访低时延,可能避免出现跨Region跨网拜访,实现云上用户拜访减速。原文链接本文为阿里云原创内容,未经容许不得转载。

October 16, 2020 · 1 min · jiezi

关于npm:随时随地查看业务数据DataV移动端新功能上新

简介: 随时随地监控业务数据,及时对焦管理策略,让数据推动业务。 在有手机就能活的明天,还只在电脑背后看报表吗? BOSS们每天解决有数的音讯和邮件,还要四处奔波散会,没有方法时时刻刻在电脑前关注企业的经营数据。想随时随地查看企业数据,DataV的挪动端理解一下,开箱即用的挪动端可视化解决方案,满足你的各种可视化需要。 其实DataV之前就有出过挪动端的模板,只是暗藏在海量模板中没有那么显著,所以还有好多人不晓得DataV之前就能够做挪动端的大屏。然而之前的挪动端还比拟高级,编辑上也是十分不不便,不能适配分辨率,如果要做个正经的挪动端大屏,还得手把手的来调整,现在的手机更新迭代更是频繁的不要不要的,这个分辨率也是重口难调。让咱们来看看全新的挪动端画布编辑器有什么性能吧! 独立的编辑器挪动端画布编辑器是独立的,与PC端大屏的编辑器是离开的,不必再像以前一样在大堆的PC端模板中推着眼镜寻找了。 适配挪动端的视觉效果配套挪动端模板与组件,还可通过智能主题性能,对挪动端可视化利用进行正当的配色,完满反对 H5 环境。必定会有好奇宝宝会问到:那我想用PC端的组件怎么办?Of course,PC端的组件当然能够应用在挪动端。丰盛的图表性能组件,满足各种性能需要,可笼罩各类场景。 PC端一键转移挪动端咱们也始终在思考怎么样把PC端的一些设计理念“移植”到挪动端?实现PC端与挪动端的资源互联互通,从而做到“一次设计,任意部署”,轻松实现一表多屏。所以就有了一键转移挪动端的性能,能够将曾经做好的PC端可视化利用内容一键智能排布成挪动端展现的款式,方便使用手机或其余挪动端查看以后制作实现的可视化利用。 更灵便的编辑能力绝对PC端,挪动端屏幕展现的区域更具局限性,整个页面布局须要思考挪动端浏览的舒适性,所以在编辑时画布的灵便设置至关重要。DataV挪动端画布编辑提供流式布局画布配置和布局容器,可自在治理流式布局画布和各个组件。更有辅助线、图层搜寻框等工具栏,可分明各个容器的地位,编辑时对进步视觉美感提供帮忙。即使是非专业人员也可轻松搭建高水准可视化利用.整个挪动端还是秉承着DataV的定位:“帮忙非专业的工程师通过图形化的界面轻松搭建业余水准的可视化利用。”更是解决了领导出差近程查看数据不便的问题,进步管理决策效率,及时对经营情况做出反馈。为平台用户也是提供了更为灵便便捷的服务。 原文链接本文为阿里云原创内容,未经容许不得转载。

October 13, 2020 · 1 min · jiezi

关于npm:NPM使用规则

1、NPM版本号应用NPM下载和公布代码时都会接触到版本号。NPM应用语义版本号来治理代码,这里简略介绍一下。 语义版本号分为X.Y.Z三位,别离代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下准则更新。 如果只是修复bug,须要更新Z位。如果是新增了性能,然而向下兼容,须要更新Y位。如果有大变动,向下不兼容,须要更新X位。版本号有了这个保障后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范畴的版本号。例如"argv": "0.0.x"示意依赖于0.0.x系列的最新版argv。

October 12, 2020 · 1 min · jiezi

关于npm:如何正确使用淘宝npm镜像

当我在一个农村的小镇上,用的是挪动宽带,用npm去拉载一些依赖时,常常抛出 info There appears to be trouble with your network connection. Retrying... //你的网络连接仿佛有问题,在重试…哪怕我开了网络代理,也会呈现, 装置一个依赖十分麻烦,这时才想到用淘宝镜像代理 长期应用npm --registry https://registry.npm.taobao.org install express永恒应用npm config set registry https://registry.npm.taobao.org配置CNPM这样的话,你用npm走的还是官网的,cnpm走的代理 npm install -g cnpm --registry=https://registry.npm.taobao.org复原应用npm config set registry https://registry.npmjs.org验证是否设置胜利npm info expressornpm config get registry NPM相干命令整顿 npm 罕用的一些命令,不便查看继续更新npm你能够通过上面的命令显示npm以后的版本: npm -v如果有须要,能够通过上面的命令更新npm: npm install -g npm当 Node 的主版本 released 之后,你也可能须要从新构建 C++ 扩大: npm rebuild如果你须要治理多个版本的node.js和npm,能够思考应用 n 或者 nvm,https://www.sitepoint.com/quick-tip-multiple-versions-node-nvm/,我举荐大家应用nvm去治理node.js版本 卸载如需删除 node_modules 目录上面的包(package),请执行: npm uninstall <package>: npm uninstall lodash如需从 package.json 文件中删除依赖,须要在命令后增加参数 --save: ...

October 7, 2020 · 2 min · jiezi

关于npm:npm-常用命令

npm 罕用指令npm 材料1. npm 官网注册账号:[npm 官网](https://www.npmjs.com/)2. 中文网站1:[中文网站](https://cloud.tencent.com/developer/section/1490282)2. 中文网站2:[官网中文网站](https://www.npmjs.cn/)发包根底流程1. npm login (=npm adduser): 须要输出 npm 用户名, 明码 和 邮箱, 按提醒即可2. npm version patch(minor/major): 降级补丁版本(小、大版本)3. npm pushlish: 公布, 如果不胜利请改下版本号4. npm unpublish moduleName@versionNum: 删除模块镜像1. npm config get registry:查看以后仓库源2. npm config list: 查看 npm 配置信息3. npm config set registry=url: 设置 镜像, 默认源(url=http://registry.npmjs.org) 淘宝镜像,registry=https://registry.npm.taobao.org4. npm install -g cnpm --registry=https://registry.npm.taobao.org:设置淘宝镜像5. npm --registry https://registry.npm.taobao.org install moudleName: 长期镜像包治理1. npm install -g moduleName:全局安装包2. npm install moduleName: 以后我的项目模块3. npm list -g --depth num: 查看全局装置过的模块 Num 示意列出模块目录的深度, 0 示意第一级目录4. npm list --depth num: 列出部分装置的模块5. npm uninstall -g moduleName: 卸载全局装置的模块6. npm uninstall moduleName:卸载部分装置的模块7. npm config get cache: 查看缓存位8. npm config get prefix:npm全局node包地位,(npm root -g)9. npm config set prefix <new_path>: 设置指定装置模块地位10. npm config set cache <new_path>:设置缓存地位11. npm cache clear --force:清缓存

October 2, 2020 · 1 min · jiezi

关于npm:浏览器标签页之间通信之-LocalstorageIndexedDB

举荐一个最近写的工具 @lllllxt/storage-idb-message,用于同源下浏览器标签之间的通信, 相比纯用Localstorage做通信,这个插件能够传递更大的数据。 文档:storage-idb-message基于 LocalStorage + IndexedDB 封装的消息传递的模块,在同源(不跨域)的前提下,用于同一页面多个 iframe、跨 tab 页面、挪动端不同 webview 页面之间的消息传递做这玩意的初衷原本我是只用 LocalStorage 做消息传递的, 但起初某次在 Chrome 上传递的数据>5M 导致数据失落,于是乎就有了用 LocalStorage 做指令,IndexedDB 做数据存储这个想法了 参考: LocalStorage 贮存空间在 2.5MB 到 10MB 之间(各家浏览器不同),而 IndexedDB 比 LocalStorage 大得多,一般来说不少于 250MB,甚至没有下限。 通过 npm 装置npm i @lllllxt/storage-idb-messageimport StorageIdbMessage from '@lllllxt/storage-idb-message'const StorageIdbMessage = request('@lllllxt/storage-idb-message')const _SIM = new StorageIdbMessage(opts: Opts)// 监听指令_SIM.response = (orderName, data) => { console.log(orderName, data)})// 发送指令_SIM.send(YourOrder, AnyData)通过<script>标签援用storage-idb-message.min.js 此办法是向 window 对象中注册一个 StorageIdbMessage 对象 参数(Opts)参数形容storageKey指令的 LocalStorage key 名称clearIdb默认 true,是否在 response 后革除 IndexedDB 的数据force默认 false,调用 clearCache 革除缓存办法办法形容send(order: String, data: any)发送response(order: String, data: any)响应其余页面传过来的指令静态方法办法形容clearCache(successFn?: Function, errFn?: Function)革除 indexedDB 缓存BTW ------------------------------------因为开发初衷是为了在vue工程上应用, 于是同时也写了基于这个工具开发的vue插件 @lllllxt/vue-storage-idb-message ...

September 27, 2020 · 1 min · jiezi

关于npm:npm报错-openssl-config-failed-fopenno-such-process

谬误openssl config failed: error:02001003:system library:fopen:no such process重新安装opensslhttps://slproweb.com/products... 配置环境变量OPENSSL_CONF=装置目录binopenssl.cfg重启

September 22, 2020 · 1 min · jiezi

关于npm:Apidoc生成接口文档PHP

一开始应用PHPDocumentor生成接口文档,然而,感觉有点不够不便,后换成了apidoc. 装置npm install apidoc -g或者应用yarn装置 yarn global add apidoc配置(apidoc.json)每次导出接口文档都必须要让apidoc读取到apidoc.json文件(如果未增加配置文件,导出报错),你能够在你我的项目的根目录下增加apidoc.json文件,这个文件次要蕴含一些我的项目的形容信息,比方题目、简短的形容、版本等,你也能够退出一些可选的配置项,比方页眉、页脚、模板等。apidoc.json { "name": "零碎接口文档", "version": "0.0.1", "description": "文档总形容", "title": "apidoc浏览器自定义题目", "url" : "文档url地址"}我的--order排序 { "name": "平安质量检查ServiceAPIs", "version": "1.0.0", "description": "平安质量检查接口文档", "title": "API接口文档", "url": "http://safety.local:8889", "sampleUrl": "http://safety.local:8889", "order": [ "根底接口", "myWorkbench", "查看流动", "getActivity", "getActivityInfo", "addActivityFile", "getRectify", "getInfoList", "handleActivity", "searchAccount" ]}示例: /** * @api {GET} /api.php?m=check&a=getActivity 查看所有查看流动列表 * @apiName getActivity * @apiGroup 查看流动 * @apiDescription 查看流动列表 * * @apiParam {String} token="s2iph9ik" 用户token * @apiParam {Number} adminid=3 用户id * @apiParam {Number=0,1,2,3,4} [type=0] 流动性质 0默认 1专项查看 2综合查看 3月度查看 4季度查看 * @apiParam {Number=0,1,2,3} [status=0] 查看活动状态 0未开始 1进行中 2已实现 3已勾销 * @apiParam {Number} [page=1] 页数 * @apiParam {Number} [num=10] 每页展现数量 * * @apiSuccess {Number} code 返回信息码 200 示意申请胜利 * @apiSuccess {String} msg 返回阐明信息 * @apiSuccess {boolen} success 申请胜利 * @apiSuccess {json} data 胜利数据 * @apiSuccess {Number} activity_record_num 问题记录数量 * * @apiSuccessExample Success-Response: * HTTP/1.1 200 OK * * { * "code": 200, * "msg": "", * "data": [{ * "id": "6", * "title": "2020年第二季度综合查看", * "property": "专项查看", * "check_project": "", * "dept": "xxxx部", * "check_range": "xx标段,xx标段", * "check_status": "0", * "start_time": "2020-08-19", * "end_time": "2020-08-31", * "add_time": "2020-09-01 09:00:49", * "summary": "查看查看", * "remark": "", * "file": "17", * "check_name": "bim", * "check_id": "13", * "check_phone": "17611241011", * "uid": "3", * "issue_status": "已整改回复", * "file_info": [{ * "filename": "创优网上填报零碎.docx", * "filepath": "upload/2020-05/22_12131327.docx" * }], * "activity_record_num": 2 * }], * "success": true * } * * @apiSampleRequest /api.php?m=check&a=getActivity */成果: ...

September 21, 2020 · 2 min · jiezi

关于npm:Npm依赖版本变动引发的惨案

来了新共事,拉同一个我的项目到本地装置依赖之后跑不起来,然而其余三台电脑运行着都没问题。接下来就是逐渐定位问题,首先排除了代码问题,因为最新代码在其余共事不同零碎的电脑上都没失常运行,进过百度/谷歌/github issue搜寻报错、重复从新拉我的项目、重启电脑、重装环境、重装系统等一天的的操作之后,终于定位到大略是依赖包版本更新的问题。。 我的项目里一共有60+依赖,次要的几个依赖都是手动锁死版本的,但有个lozad没有锁死,而且前段时间应该是公布了次版本更新,跟nuxt的兼容有问题所以报了错。跟运行失常我的项目的node_moduels中lozad版本比照,改了之后果然我的项目就跑起来了。 npm包治理原理在思考解决方案前,首先理解下npm包治理及依赖版本治理的原理。这些都是通过package.json文件实现的 当你应用npm装置一个包(并保留它)或者更新一个包的时候,package.json里就主动增加了一条信息,包含包名和其版本。npm默认装置最新版本,而后在其版本号之前增加一个^符号。比方^1.2.12,它表明最低应应用1.2.12版本。并且在这之上,领有雷同大版本号的任何版本都是OK的。毕竟小版本和bugfix版本不会对应用造成任何影响,所以用任何雷同大版本的更高级版本都很平安。 符号^:示意主版本固定的状况下,可更新最新版。例如:vuex: "^3.1.3",3.1.3及其以上的3.x.x都是满足的。符号~:示意次版本固定的状况下,可更新最新版。如:vuex: "~3.1.3",3.1.3及其以上的3.1.x都是满足的。无符号:无符号示意固定版本号,例如:vuex: "3.1.3",此时肯定是装置3.1.3版本。举例:"^1.2.3": 大于等于 1.2.3 且小于 2.0.0版本"^0.3.4": 大于等于 0.3.4 且小于 0.4.0版本"^0.0.6": 大于等于 0.0.6 且小于 0.0.7版本版本依赖为什么须要锁定没有版本锁定的状况下,在执行每次npm i的时候,对应的版本前都有个 ^ 符号。也就是未固定版本的依赖如果有了次版本更新或者订正版本更新,会主动装置对应的最新版。 在这种状况下,你再次install时装置的包的版本可能与前次不一样,具体的,你能够到package-lock.json中查看理论的包版本。 例如:A新建了一个我的项目,生成了下面这份package.json文件,但A装置依赖的工夫比拟早,此时packageA的最新版本是2.1.0,该版本与代码兼容,没有呈现bug。起初B克隆了A的我的项目,在装置依赖时packageA的最新版本是2.2.0,那么依据语义npm会去装置2.2.0的版本,但2.2.0版本的API可能产生了改变,导致代码呈现bug。 这就是package.json会带来的问题,同一份package.json在不同的工夫和环境下装置会产生不同的后果。 实践上这个问题是不应该呈现的,因为npm作为开源世界的一部分,也遵循一个公布准则:雷同大版本号下的新版本应该兼容旧版本。即2.1.0降级到2.2.0时API不应该发生变化。但很多开源库的开发者并没有严格遵守这个公布准则,导致了下面的这个问题。 为了在不同的环境下生成雷同的node_modules,引入版本依赖锁定就尤为必要了。 npm5.0之前能够通过npmshrinkwrap实现。通过运行 npm shrinkwrap,会在当前目录下生成一个 npm-shrinkwrap.json文件,外面蕴含了通过以后 node_modules 计算出的模块的依赖树及版本。只有目录下有 npm-shrinkwrap.json ,则运行 npm install 的时候会优先应用 npm-shrinkwrap.json 进行装置,没有则应用 package.json 进行装置。 在npm5.0之后,npm自带了package-lock.json文件,通过npm装置依赖,每当node_modules目录或者package.json发生变化时就会生成或者更新这个文件。不同版本有有些不同: npm 5.0.x版本:不论package.json中依赖是否有更新,npm i都会依据package-lock.json下载。针对这种装置策略,有人提出了这个issue - #16866 ,而后就演变成了5.1.0版本后的规定。5.1.0版本后:当package.json中的依赖项有新版本时,npm install会忽视package-lock.json去下载新版本的依赖项并且更新package-lock.json。针对这种装置策略,又有人提出了一个issue - #17979,参考 npm 贡献者 iarna 的评论,得出5.4.2版本后的规定。5.4.2版本后:如果只有一个package.json文件,运行npm i会依据它生成一个package-lock.json文件,这个文件相当于本次install的一个快照,它不仅记录了package.json指明的间接依赖的版本,也记录了间接依赖的版本。 如果package.json的semver-range version和package-lock.json中版本兼容(package-lock.json版本在package.json指定的版本范畴内),即便此时package.json中有新的版本,执行npm i也还是会依据package-lock.json下载 - 实际场景1。 如果手动批改了package.json的version ranges,且和package-lock.json中版本不兼容,那么执行npm i时package-lock.json将会更新到兼容package.json的版本 - 实际场景2。 ...

September 19, 2020 · 1 min · jiezi

关于npm:npm-i-S-D-g的区别

1)npm -i == npm install2)写入dependcies,公布到开发环境npm install module_name --save == npm i module_name -S3)写入devDependcies,生产环境npm install module_name --save-dev == npm i module_name -D4)全局装置npm i module_name -g || npm install module_name -g 5)本地装置(将包放在./node_modules)npm i module_name || npm install module_namenpm i -S -D -g的区别

September 18, 2020 · 1 min · jiezi

关于npm:Lerna-多包存储管理工具一

lerna最近在看vue-cli的源码局部,留神到这一个仓库下保护了多个package,很好奇他是如何在一个repo中治理这些package的。 咱们组当初也在应用组件库的形式保护我的项目间共用的业务代码。有两个组件库,存在依赖的关系,目前联调是通过npm link的形式,性能并不好,时常呈现卡顿的问题。加上前一段时间组内分享vue3也提到了lerna,于是便决定认真的调研一下这个工具,为接下里的组件库优化助力。 lerna的文档还是很具体的,因为全是英文的,思考到浏览问题,这里我先是本人跑了几个demo,而后做了中文翻译。后续我会出一篇专门的lerna实战篇 demo lerna 是干什么的?Lerna 是一个工具,它优化了应用 git 和 npm 治理多包存储库的工作流。 背景1.将一个大的 package 宰割成一些小的 packcage 便于分享,调试 2.在多个 git 仓库中更改容易变得凌乱且难以跟踪 3.在多个 git 仓库中保护测试繁琐 两种工作模式Fixed/Locked mode (default)vue,babel 都是用这种,在 publish 的时候,所有的包版本都会更新,并且包的版本都是统一的,版本号保护在 lerna.jon 的 version 中 Independent modelerna init --independent 独立模式,每个 package 都能够有本人的版本号。版本号保护在各自 package.json 的 version 中。每次公布前都会提醒曾经更改的包,以及倡议的版本号或者自定义版本号。这种形式绝对第一种来说,更灵便 初始化我的项目npm install -g lerna // 这里是全局装置,也能够装置为我的项目开发依赖,应用全局不便前期应用命令行mkdir lerna-repocd lerna-repolerna init // 初始化一个lerna我的项目构造,如果心愿各个包应用独自版本号能够加 -i | --independent 规范的 lerna 目录构造每个独自的包下都有一个 package.json 文件如果包名是带 scope 的,例如@test/lerna,package.json 中,必须配置"publishConfig": {"access": "public"}my-lerna-repo/ package.json lerna.json LICENSE packages/ package-1/ package.json package-2/ package.json启用 yarn Workspaces (强烈建议)Workspaces can only be enabled in private projects. ...

September 9, 2020 · 11 min · jiezi

关于npm:SpringCloud-应用在-Kubernetes-上的最佳实践-高可用熔断

前言阿里巴巴十多年的双十一,锻炼进去了一套业界当先的高可用技术,有一些曾经商业化(云产品 PTS、AHAS),也有的开源了如:Sentinel、ChaosBlade。咱们这一系列的高可用章节也次要介绍这方面的内容。明天介绍熔断局部,即开源产品 Sentinel 的外围能力。 问题定义在一个常见的分布式应用中,一个申请先通过终端达到 Gateway,再通过防火墙和网络负载平衡,其中还包含调用上游的其它服务和第三方利用,能力达到前端网络服务;如下图所示。 和这样一个架构一样,大家可能也会遇到如下的一些相熟的 Case : 霎时洪峰流量导致系统超出最大负载,load 飙高,零碎解体导致无奈失常提供服务。“黑马”热点数据击穿缓存,DB 被打垮,挤占失常流量。调用端被不稳固服务拖垮,线程池被占满,导致整个调用链路卡死甚至零碎雪崩......这些不稳固的场景可能会导致严重后果。大家可能想问:如何做到平均平滑的用户拜访?如何预防流量过大或服务不稳固带来的影响?这时候咱们就要请出微服务稳定性的法宝 —— 高可用流量防护,其中重要的伎俩就是流量管制和熔断降级,它们是保障整个零碎稳定性重要的一环。 流量管制流量是十分随机性的、不可预测的。前一秒可能还惊涛骇浪,后一秒可能就呈现流量洪峰了(例如双十一零点的场景)。然而咱们零碎的容量总是无限的,如果忽然而来的流量超过了零碎的承受能力,就可能会导致申请解决不过去,沉积的申请解决迟缓,CPU/Load 飙高,最初导致系统解体。因而,咱们须要针对这种突发的流量来进行限度,在尽可能解决申请的同时来保障服务不被打垮,这就是流量管制。 熔断降级一个服务经常会调用别的模块,可能是另外的一个近程服务、数据库,或者第三方 API 等。例如,领取的时候,可能须要近程调用银联提供的 API;查问某个商品的价格,可能须要进行数据库查问。然而,这个被依赖服务的稳定性是不能保障的。如果依赖的服务呈现了不稳固的状况,申请的响应工夫变长,那么调用服务的办法的响应工夫也会变长,线程会产生沉积,最终可能耗尽业务本身的线程池,服务自身也变得不可用。 Spring Cloud 中如何做熔断?在原来的 Spring Cloud 产品族中,有自带的熔断组件 Hystrix ,是 Netflix 公司提供的一个开源的组件,提供了熔断、隔离、降级的这些个性,不过 Hystrix 在 2018 年 11 月份开始,就不再迭代开发,进入保护的模式。不过好消息是也就是这一年开源了 Spring Cloud for Alibaba 产品族,其中的 Sentinel 完满的对 Hystrix 做了补充,上面针对 Sentinel 做一些根本介绍。 Sentinel 工作原理?Sentinel 以资源流量(URL、线程、本地函数、Dubbo服务等)为切入点,依据用户输出的规定,自适应的做到流量管制、熔断降级、零碎负载爱护等多个维度,全方位的保障系统的稳定性。并提供了一套具备丰盛的利用场景、齐备的实时监控、宽泛的开源生态、欠缺灵便的 SPI 扩大点的完满的高可用解决方案产品,一个根本的原理介绍图如下,具体介绍请参考官网文档。 在应用上,针对支流框架默认提供主动适配的能力来定义须要爱护的资源,并提供设施对资源进行实时统计和调用链路剖析。同时,Sentinel 也提供凋谢的接口,不便您自定义并扭转规定。 疾速应用 Sentinel 的形式除了在开源提供的计划之外,Sentinel 曾经以多种状态进入到了各种云产品的组合解决方案中,列举如下: 一、在 AHAS 中应用Sentinel 当初曾经是阿里云云产品 AHAS 的重要能力,应用形式请参考官网文档,相比开源的形式接入,云产品次要省去了繁琐的配置,提供了更快的接入形式,以及更敌对的产品管控界面,以及更弱小的能力;当然除此之外,最重要的是在接入和运行的过程中,都能够取得原厂同学的间接的反对。 ...

August 26, 2020 · 1 min · jiezi

关于npm:Npm-上传攻略-菜鸟版

前言截止本文公布时——2020-08-13,作者也是刚学会npm如何公布本人的代码,期间走了很多弯路——即便网上有很多教程,具体起因在此略过,发表此文的初衷是心愿帮忙和我一样的初学者学会如何公布到npm,能力无限,有谬误欢送提出! 注释作者技术栈为Vue、Typescript —— 均为初学,包管理工具为Yarn —— 不分明的请百度创立我的项目全局装置Vue-cli脚手架yarn global add @vue/cli创立我的项目(具体流程略过)vue create npm-demo 创立Loading组件components └─ Loading index.ts loading.vueindex.ts //先引入loading组件import LoadingComponent from './loading.vue'const Loading: any = {}Loading.install = function (Vue: any) { // 生成一个Vue的子类 同时这个子类也就是组件 const ToastConstructor = Vue.extend(LoadingComponent) // 生成一个该子类的实例 const instance = new ToastConstructor() // 将这个实例挂载在我创立的div上 // 并将此div退出全局挂载点外部 instance.$mount(document.createElement('div')) document.body.appendChild(instance.$el) //注入vue的原型链 Vue.prototype.$loading = { show() { instance.show = true }, close() { instance.show = false } }}export default Loadingloading.vue ...

August 13, 2020 · 2 min · jiezi

关于npm:node-yarn-git-安装及配置

此文仅仅用来记录换电脑时根本开发环境装置,VSCode局部请移步编辑器IDE之VSCodenode装置下载https://nodejs.org/en/ 装置node -v 查看是否装置胜利 批改全局批改npm全局安装包门路 & 缓存门路npm config set prefix "D:/Program Files/nodejs/npm_global"npm config set cache "D:/Program Files/nodejs/npm_cache"装置 npm install -g eslint装置后尝试 eslint -v 你会发现提醒eslint 不是外部命令。所以持续下一步 配置环境变量 讲下面配置的全局安装包prefix门路作为新的环境变量即可 5.验证尝试 eslint -v 可失常运行即可,配置完环境变量须要从新起一个cmd窗口,之前的可能会提醒不是外部命令 yarn装置下载https://classic.yarnpkg.com/zh-Hans/docs/install/#windows-stable git下载安装https://git-scm.com/downloads git config --global user.name "xft" git config --global user.email xft@test.comSSH 配置生成cd ~/.sshssh-keygen -t rsa -C "xft@test.com"获取ssh keycat ~/.ssh/id_rsa.pub设置ssh key

August 12, 2020 · 1 min · jiezi

关于npm:node-yarn-git-安装及配置

此文仅仅用来记录换电脑时根本开发环境装置,VSCode局部请移步编辑器IDE之VSCodenode装置下载https://nodejs.org/en/ 装置node -v 查看是否装置胜利 批改全局批改npm全局安装包门路 & 缓存门路npm config set prefix "D:/Program Files/nodejs/npm_global"npm config set cache "D:/Program Files/nodejs/npm_cache"装置 npm install -g eslint装置后尝试 eslint -v 你会发现提醒eslint 不是外部命令。所以持续下一步 配置环境变量 讲下面配置的全局安装包prefix门路作为新的环境变量即可 5.验证尝试 eslint -v 可失常运行即可,配置完环境变量须要从新起一个cmd窗口,之前的可能会提醒不是外部命令 yarn装置下载https://classic.yarnpkg.com/zh-Hans/docs/install/#windows-stable git下载安装https://git-scm.com/downloads git config --global user.name "xft" git config --global user.email xft@test.comSSH 配置生成cd ~/.sshssh-keygen -t rsa -C "xft@test.com"获取ssh keycat ~/.ssh/id_rsa.pub设置ssh key

August 12, 2020 · 1 min · jiezi

关于npm:cnpm-v卡顿无法下载各种包

问题产生:执行cnpm的时候,就始终卡住 先卸载原来的cnpm npm uninstall -g cnpm --registry=https://registry.npm.taobao.org注册模块镜像 npm set registry https://registry.npm.taobao.orgnode-gyp 编译依赖的 node 源码镜像 npm set disturl https://npm.taobao.org/dist清空缓存 npm cache clean --force装置cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org作者:哆啦在这A梦在哪 链接:https://www.jianshu.com/p/f73... 起源:简书 著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。

August 10, 2020 · 1 min · jiezi

关于npm:cnpm-v卡顿无法下载各种包

问题产生:执行cnpm的时候,就始终卡住 先卸载原来的cnpm npm uninstall -g cnpm --registry=https://registry.npm.taobao.org注册模块镜像 npm set registry https://registry.npm.taobao.orgnode-gyp 编译依赖的 node 源码镜像 npm set disturl https://npm.taobao.org/dist清空缓存 npm cache clean --force装置cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org作者:哆啦在这A梦在哪 链接:https://www.jianshu.com/p/f73... 起源:简书 著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。

August 10, 2020 · 1 min · jiezi

关于npm:一站配齐所有国内镜像

开发过程中,咱们常常会用到各种各样的包管理工具,简直每种包管理工具缺省设置都是从国外服务器下载相应的软件安装包,或者下载很慢,或者罗唆无奈下载。以下列出我罕用的所有国内镜像,不便有相似需要的同学参考(不定期更新,感觉有用的同学请留神珍藏)。 我平时用的shell是fish,所以上面的语法全都是fish相干的set -x,如果是用缺省的bash,能够替换成export命令。 操作系统相干brew国内镜像cd /usr/local/Homebrewgit remote set-url origin https://mirrors.ustc.edu.cn/brew.gitcd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-coregit remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.gitcd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-caskgit remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git# brew国内镜像set -x HOMEBREW_BOTTLE_DOMAIN https://mirrors.ustc.edu.cn/homebrew-bottlesJavascript相干npm国内镜像npm config set registry https://registry.npm.taobao.org/yarn国内镜像yarn config set registry https://registry.npm.taobao.org/pnpm国内镜像pnpm config set registry https://registry.npm.taobao.org/electron国内镜像set -x ELECTRON_MIRROR http://npm.taobao.org/mirrors/electron/node-sass国内镜像set -x SASS_BINARY_SITE https://npm.taobao.org/mirrors/node-sass/fsevents国内镜像set -x FSE_BINARY_HOST_MIRROR https://npm.taobao.org/mirrors/fsevents/更多更多设置,或者懒得一个一个设置的同学也能够参考这里: https://gist.github.com/hetyk... 把这些代码下载到一个shell脚本里,一键增加实现。 Python相干pip国内镜像$ cat ~/.pip/pip.conf[global]index-url=https://pypi.tuna.tsinghua.edu.cn/simpleconda国内镜像conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/conda config --set show_channel_urls yes其它语言flutter国内镜像set -x PUB_HOSTED_URL https://pub.flutter-io.cnset -x FLUTTER_STORAGE_BASE_URL https://storage.flutter-io.cn补充github国内镜像如果是在git clone时遇到了问题,能够先在码云建设一个库,起源取自github,然后同步码云这个库即可。 ...

July 19, 2020 · 1 min · jiezi

听陶建辉直播分享技术创业经验总结

终于明天松口气,有工夫听了下陶建辉分享技术守业教训直播。为了能不便给还在加班的对象分享明天学习到的内容,索性整理出来一份,分享给也同样关注该话题的人~一、直播内容记录1.技术人怎么防止掉入坑2.怎么找到技术守业的反向3.怎么找到第一笔天使投资4.应该组建怎么的守业团队5.有信心很重要6.怎么留住人才7.胜利的法宝:策略办法 二:这些心愿对做大数据的他有用 三、问答环节的播种:1.举荐的几本守业人要看的书:《Lean Startup》《Hard thing about hard things》《Crossing Chasm》《Innovator's Dilemma》2.大佬微博:陶建辉-Jeff3.大佬公司官网:https://www.taosdata.com/cn/4.大佬微信公众号:taosdata5.github上开源我的项目:https://github.com/taosdata/T...6.补充一点:要纯熟的把握英文,要多结识各界的搭档 因为工夫较晚,改天再做深刻的学习探讨,还会加上本人的感悟。@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 发现明天的本人真有点开始不一样起来了~ 自律真的会带来更多的扭转~ 加油( •_•) ----写于2020.7.9 21:51

July 9, 2020 · 1 min · jiezi

思考总结npm认识

npm认识作为一个前端开发者,用了这么久的npm,有一天突然问自己。自己究竟对npm有多了解? npm是一个包管理工具想想我们最早写js的时候,对于重复引用的代码片段,我们是怎么引用的? <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">是不是感觉熟悉又陌生。这就是最早我们引用js的方式。后来由于nodejs出现了,作为一种可以运行在系统上的语言,没有了html,我们该怎么引用js呢? module.exports=function(x){console.log(x);}; var xxx = require('xxx');因此出现了CommonJS规范。当然此外,我们还有AMD,CMD等。那么这些规范的出现使得我们可以更加愉快地引用js代码。这时候我们便需要一种方式可以更方便地提交或者获取某些代码。npm因此出现了。他有以下功能: 允许用户从NPM服务器下载别人编写的第三方包到本地使用。允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。npm做了什么?首先我们要知道我们的项目中需要用到什么依赖,版本是什么?这些信息需要找一个地方记录,这就是package.json。 npm initnpm可以通过命令创建模块,生成 package.json 文件,生成的文件包含了基本的结果。当我们需要从网上下载依赖的时候只要执行 npm ininstall xxxnpm就会把依赖下载放到node_modules文件夹中,并在package.json中记录我们下载的依赖的名称和版本号。 引用流程当我们引用js的时候,系统该去哪里找我们需要的代码?npm作了一个规范,就是node_modules。系统会先当前目录找有没有适合的代码,如果找不到就往上一层文件夹找,找到node_modules之后就会在node_modules里找。找到代码,便引用成功。如果找不到就在全局里面找,还找不到就会抛出错误。 package-lock.json上面刚刚说到的,npm引用的时候是一层一层的往外找的,这是为什么呢?因为我们在开发的时候引用的某些依赖本身,并不是完全由该作者全程写完的。有可能某些依赖中还依赖着另一个包。所以我们会看到node_modules包里的文件夹里还有一个package.json,而他的依赖则放在当前的文件夹里的node_modules中。 ├─node_modules └─xxx └─node_modules这样就会产生一个问题,万一引用的依赖又套另一层依赖,这样由非常多层依赖组层。最后引用的路径就会很长,有可能会遇到不可估算的错误。另外这样也会导致同一个包会被下载多次的问题。为了解决这个问题,从npm 5(这就是为什么会有yarn 的原因) 之后package-lock.json出现了。他的作用是记录这项目中用到的依赖包的具体版本号,和位置信息。在每次install的时候他会先检查node_modules的首层有没有该依赖需要的包,如果有了就不下载。如果有同名的包,可是版本号需求不同,就会在该package.json的路径下再创建node_modules把那个需要的包放进去。这样由于引用的时候是一层一层外网找的,就可以确保当前依赖引用的是正确的包。也大大减少了套层的情况。 下载的库在哪里?我们都知道当我们执行npm install的时候,会下载我们想要的代码。可是他是从哪里下载回来的呢?npm有自己的一个代码库,也就是我们常用的https://www.npmjs.com。可是这里有个问题,这个地址的国外的服务器,会导致我们经常出现下载很慢的结果。这就出现了很多我们说的“源”。所谓的“源”就是不同的代码仓库,国内目前用的最多的应该就是阿里的源,想要改变下载代码的仓库只要执行。 npm install xxx --registry=https://registry.npm.taobao.org这样我们就可以改成从阿里的服务器上下载资源。如果想要全局替换这个源,可以执行 npm config set registry https://registry.npm.taobao.org这时候可能又聪明的同学要问了,能不能在不改全局配置的情况下给项目规定一个特定的源?其实在npm的安装目录下有一个.npmrc文件,他记录着npm的源地址,我们通过上面的命令事实上就是在修改他。如果我们想要在项目中配置特定的源,只要在项目目录下新建一个.npmrc文件,编辑内容: registry=https://registry.npm.taobao.org这样只要我们在这个项目下执行npm install都会指向我们规定的地址了。 待补充...

July 7, 2020 · 1 min · jiezi

Npm常用命令

欢迎订阅我的公众号,微信搜索【 比邻之地 】我会定期发布教程,分享软件,有问题欢迎留言! 介绍 NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载、安装、上传以及管理已经安装的包,类似的还有 cnpm、yarn、tyarn ··· 1. 切换淘宝源、官方源强烈建议安装 nrm :npm 的源管理器 切换 npm 镜像源 npm config set registry [这里是镜像源 url]a 官方源 npm config set registry https://registry.npmjs.org速度慢可以,https -> http,这样网速就会好很多 npm config set registry http://registry.npmjs.orgb 淘宝源 npm config set registry https://registry.npm.taobao.orgc 使用cnpm(用cnpm -v检测是否成功) npm install -g cnpm --registry=https://registry.npm.taobao.orgd 手动修改设置淘宝源 1.打开.npmrc文件(node默认安装再C盘-C:Program Filesnodejsnode_modulesnpmnpmrc,没有的话可以使用git命令行建一个( touch .npmrc),用cmd命令建会报错)2.增加 registry=https://registry.npm.taobao.org 即可。检测是否修改成功,查看当前使用的 npm 镜像源 npm config get registryornpm info express显示进度条 npm config set loglevel=http2. 用npm安装依赖包node包的安装分为全局模式和本地模式:A、一般情况下会以本地模式运行,包会被安装到和你的应用程序代码的本地node_modules> 目录下。 ...

July 6, 2020 · 6 min · jiezi

一分钟教你发布npm包

文章简介:1、摘要:什么是npm?2、如何发布一个自己的npm包3、发布错误集锦 摘要:什么是npm?npm是javascript著名的包管理工具,是前端模块化下的一个标志性产物简单地地说,就是通过npm下载模块,复用已有的代码,提高工作效率和移动端开发中,iOS使用的Cocoapods,Android使用的maven有异曲同工之妙。 如何发布一个自己的npm包1、创建一个npm的账号发布包之前你必须要注册一个npm的账号 2、初始化一个简单的项目发布a、本地创建一个文件夹:例如:z-toolb、执行命令进入目录: $ cd z-tool c、执行npm init 初始化项目。默认一路回车就行 sh-neverleave:z-tool neverleave$ npm initThis utility will walk you through creating a package.json file.It only covers the most common items, and tries to guess sensible defaults.See `npm help json` for definitive documentation on these fieldsand exactly what they do.Use `npm install <pkg>` afterwards to install a package andsave it as a dependency in the package.json file.Press ^C at any time to quit.package name: (z-tool) version: (1.0.0) description: entry point: (index.js) test command: git repository: keywords: author: license: (ISC) About to write to /Users/neverleave/Desktop/z-tool/package.json:{ "name": "z-tool", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC"}Is this ok? (yes) 默认字段简介:name:发布的包名,默认是上级文件夹名。不得与现在npm中的包名重复。包名不能有大写字母/空格/下滑线!version:你这个包的版本,默认是1.0.0。对于npm包的版本号有着一系列的规则,模块的版本号采用X.Y.Z的格式,具体体现为: 1、修复bug,小改动,增加z。 2、增加新特性,可向后兼容,增加y 3、有很大的改动,无法向下兼容,增加xdescription:项目简介mian:入口文件,默认是Index.js,可以修改成自己的文件 scripts:包含各种脚本执行命令test:测试命令。author:写自己的账号名license:这个直接回车,开源文件协议吧,也可以是MIT,看需要吧。d、在z-tool文件夹中创建一个文件名为index.js的文件,简单的写了一下内容。 ...

July 2, 2020 · 3 min · jiezi

自定义CLI

1、初始化项目 mkdir auto-router-clicd auto-router-clinpm init -ynpm i commander download-git-repo ora handlebars figlet clear chalk open watch -s2、在项目目录(auto-router-cli)下新建bin文件夹,在bin文件夹新建命令文件kkb.js: #!/us/bin/env node // 指定解析环境为nodeconsole.log('auto-router-cli....')const program = require('commander') //命令行工具program.version(require('../package.json').version) // 或直接写 '1.0.1'program .command('init <name>') // 定义init命令 .description('init project') .action(name => { // 指定命令要做什么事,回调函数中实现命令功能 console.log('init ' + name); }) program.parse(process.argv)3、修改package.json,添加bin命令: { "bin": { "kkb": "./bin/kkb.js", },}4、执行npm link,把命令链接到全局,相当于全局安装npm包:npm i auto-router-cli -g,这样直接在命令行运行kkb,就会执行auto-router-cli/bin/kkb.js文件。

June 30, 2020 · 1 min · jiezi

npm-常用命令

npm list // 查看本地已安装模块清单npm list [packageName] // 查看本地已安装模块版本npm info [packageName] //查看模块的详细信息 包括各版本号等npm view [packageName] version // 查看模块远程最新版本npm view [packageName] versions // 查看模块远程所有版本npm install [packageName] //安装模块npm install [packageName]@xxx.xx //安装模块的指定版本npm install [packageName] -g //全局安装模块npm install [packageName] --save 安装好后写入package.json的dependencies中(生产环境依赖)npm install [packageName] --save-dev 安装好后写入package.json的devDepencies中(开发环境依赖)npm uninstall [packageName] // 删除模块npm uninstall [packageName] -g //卸载全局模块npm uninstall [packageName] --save // 删除模块,同时删除模块留在package.json中dependencies下的对应信息npm uninstall [packageName] --save-dev // 删除模块,同时删除模块留在package.json中devDependencies下的对应信npm list --depth=0 //查看所有高级的npm moudlesnpm list --depth=0 -global //查看所有全局安装的模块

June 23, 2020 · 1 min · jiezi

记录npm报错-Command-failed-CWindowssystem32cmdexe

错误 这是node-sass安装时出错 出错原因是:GitHub的raw.githubusercontent.com无法链 至于为啥没有连接,可能是部分地区解析Ip被污染了。 解决方法: 修改hosts解决199.232.28.133  raw.githubusercontent.com

June 9, 2020 · 1 min · jiezi

如何通过nvm安装多版本nodejs如果nodejs安装成功npm安装失败了怎么办

我们在开发项目的时候,最开始,是只有一个老的项目,老项目单独安装了node版本4.4.7,后来有了新项目,由于有两个项目,但是一个需要老一些版本的node,一个需要新版本的node,因此需要在两个版本之间进行切换,这时候应该怎么做呢? nvm可以很好的解决这个问题,我们一起来看看把。 一、什么是nvm? nvm就是nodejs version manage 叫做nodejs 版本管理,而nodejs有很多版本,场景如下: 1、而你手上开发的有多个项目又分别是不同的nodejs版本,咱们就可以用nvm轻松切换! 2、假设你正在开发的项目开始使用的nodejs版本是8.0,而现在因为某些原因,你需要升级 或者 降级 nodejs 版本,也可以使用 nvm 轻松切换 二、搭建步骤:1、下载nvm https://github.com/coreybutler/nvm-windows/releases ,解压并且安装(安装nvm的地址可以自己随便选择一个位置,node地址设置为默认的:"C:\Program Files\nodejs",这里需要注意网上很多说地址不能设为"C:\Program Files",安装路径不支持空格,否则node无法使用,实际测试并无影响) 2、打开 cmd , 输入 nvm -v,如下,表示安装成功 3、(重要) 设置 node 和 npm 镜像地址 在nvm安装目录,找到 setting.txt加上如下两行: node_mirror: https://npm.taobao.org/mirror... npm_mirror: https://npm.taobao.org/mirror... 添加后如下图所示: 4、(重要) 安装你要的nodejs版本,必须是npm和nodejs都成功,因为有时候会npm或者nodejs不会下载成功,不成功的原因很多,前提必须按我的这个步骤,并且是之前没有装nodejs,或者是卸载干净了nodejs。通过nvm list available命令查看可下载的nodejs版本信息,根据需要下载对应的版本,LTS列表示稳定版本。 nvm install 版本号 如上表示成功了,继续检验是否真的成功,进入nvm目录查看: 有红圈出来的内容就是成功的,如果没有就是不行的,就需要重新手动下载了 5、切换版本 nvm use 版本号 这样就好了,node和 npm都好了 6、nvm命令: 1,nvm nvm list 是查找本电脑上所有的node版本 ...

June 5, 2020 · 1 min · jiezi

Vue项目接入Paypal详解

一、支付流程 在paypal的官网上给出了这个按钮内部封装的流程,整个流程只需要用户点击按钮,触发创建订单事件,然后我们再监听用户支付成功的回调,拿到订单id传给后端,让后端再进行一次校验。 二、实现方案接入方式优点缺点相关资料在html中插入paypal的script脚本实现方式比较简单1、安全性问题:公司的client_id会暴露在代码中2、引用的按钮样式比较难自定义官方文档:https://developer.paypal.com/docs/checkout/integrate/#更详细的说明:https://segmentfault.com/a/1190000021366504使用官方提供的npm包(有好几个)1、可以自定义,不需要使用官方给定的button,可以在自己的按钮上绑定创建事件2、不会把client_id暴露出来1、需要仔细阅读文档,开发难度会大一点2、有的需要配合node一起开发github:https://github.com/paypal/paypal-checkout-componentsnode-sdk:https://github.com/paypal/Pay...使用别人封装好的npm包1、使用起来方便2、文档比较清晰1、可能存在没人维护的风险2、可自定义的部分不多3、使用的是Paypalv1版接口,官网上用的是v2接口,但是应该不影响github:https://github.com/khoanguyen96/vue-paypal-checkout这是我目前总结的几种实现方案,如果有更好的方案,欢迎在评论区告诉我~ 三、项目中实现 由于我是在vue项目实现,经过考虑,别人封装的vue-paypal-checkout库可以满足开发需求,而且使用起来比较简单,所以暂时选择采取这个方案,接下来我们看看代码实现吧! npm install vue-paypal-checkoutimport PayPal from 'vue-paypal-checkout'export default { data() { return { credentials: { sandbox: '填写沙箱环境client_id', production: '填写线上环境client_id' }, buttonStyle: { label: 'pay', size: 'small', shape: 'rect', color: 'blue' } } }, components: { PayPal }, methods: { paymentAuthorized (data) { // 授权完成的回调,可以拿到订单id console.log(data); }, paymentCompleted (data) { // 用户支付完成的回调,可以拿到订单id console.log(data); }, paymentCancelled (data) { // 用户取消交易的回调 console.log(data); } }}<PayPal amount="10.00" // 付款的钱数 currency="USD" // 货币种类,默认为美元 :client="credentials" // client_id认证信息 env="sandbox" // 指定环境,默认为线上,也就是production :button-style="buttonStyle" // 自定义按钮样式 @payment-authorized="paymentAuthorized" @payment-completed="paymentCompleted" @payment-cancelled="paymentCancelled"></PayPal>以上就是我的代码实现过程,具体内容可以根据业务来修改,实现起来还是蛮简单的,如果只是想嵌入Paypal的按钮,完成基本的支付操作,这个还是完全可以支持的。 ...

June 4, 2020 · 1 min · jiezi

npm-ERR-network-timeout

一、问题周一修改了一个地方,把分支合并到develop,然后自动触发gitlab的ci,等了一会再点开看log,发现报错了。 具体如下图所示: 二、初步分析看提示是说从源拉取依赖的时候,网络超时了。 初步断定是网络问题,所以想隔一会再重试看看。结果重试了好几次,结果都一样。 因为修改的功能需要在开发环境验证后,再部署到测试环境给测试验证,然后部署到预发布环境,所以还是比较着急的。 人是否成长就看在应对突发问题导致进展被卡住能否沉稳冷静解决问题。 但往往是说起来容易做起来难。 我觉得可以这样:在心里自己跟自己说几遍,从现在开始,给自己五分钟时间,什么都别想,从头到尾再仔细看看,找出问题所在。 因为上周五及之前跑ci都没问题,重试了几次也不行,也问了后台跑ci的机器网络等问题,也没改动什么,而我又没权限登录机器查看相关信息,所以只能搜索npm ERR! network timeout来分析问题。 三、各种说法:详细讲解可点击

June 1, 2020 · 1 min · jiezi

npm更新package后重启IDE的重要性

npm更新package后要重启一下IDE,因为IDE本身是不会自动更新的,有次项目开发时遇到个问题需要更新package,更新后发现问题没有解决,就很奇怪,求助了一个大佬后才恍然大悟要重启IDE,果然,重启后之前的报错问题就解决了......重启大法真牛逼。

May 27, 2020 · 1 min · jiezi

Unexpected-end-of-JSON-input-while-parsing-near

npm install的时候报Unexpected end of JSON input while parsing near 解决方案:清除缓存 npm cache clean --force

May 27, 2020 · 1 min · jiezi

使用-nrm-管理镜像源

获取当前使用的镜像源npm config get registryhttps://registry.npmjs.org/使用指定的镜像源npm config set registry https://registry.npm.taobao.org/使用 npm config 命令来更改镜像源太麻烦, 我们使用 nrm 来帮我们管理多个镜源npm i nrm -gnrm -V1.2.1nrm 展示当前可用源nrm ls* npm -------- https://registry.npmjs.org/ yarn ------- https://registry.yarnpkg.com/ cnpm ------- http://r.cnpmjs.org/ taobao ----- https://registry.npm.taobao.org/ nj --------- https://registry.nodejitsu.com/ npmMirror -- https://skimdb.npmjs.com/registry/ edunpm ----- http://registry.enpmjs.org/nrm 列出了当前可切换使用的源, 左边带星号的表示当前正在使用的源。 使用列表中的源nrm use njRegistry has been set to: https://registry.nodejitsu.com/nrm 还可以用来测试镜像源的延迟nrm test yarncnpm --- 208msnrm test taobaotaobao - 102ms

October 13, 2019 · 1 min · jiezi

根据vuecli手摸手实现一个自己的脚手架

故事背景身为一个入门前端七个月的小菜鸡,在我入门前端的第一天就接触到了vue,并且死皮赖脸的跟他打了这么久的交到,还记得第一次用vue init webpack 这句命令一下生成一个模板的时候那种心情,当时我就想,要是自己也能写一个的话,那会是灰常吃鸡的吧 o( ̄▽ ̄)ブ,所以说今天我们也要简单实现一个自己的脚手架认识binbin的作用首先我们先来了解一下这个bin ,这个bin和我们最开始用的vue init webpack 这个命令是息息相关的 还记得我们在最开始安装vue-cli的时候嘛 npm install vue-cli -g 这条命令的意思是把vue-cli 安装到全局 ,以至于你再任何一个地方打开cmd 的时候都能够使用 vue init webpackvue init webpack 这条命令实际上是执行的vue-cli 里边 package.json 里边的bin属性下的命令 这个文件大概位置如下 这个路径里边有隐藏的路径,在查找的时候记得打开隐藏目录可见 这个bin里边大概长成这个样子 由图中可见,这里边有三个命令 vue vue-init vue-list这个三个命令的意思是执行对应的文件,Npm会在node_modules/.bin/目录下建立符号链接。又因为node_modules/.bin/目录会在运行时加入系统的PATH变量,因此在运行npm时,就可以不带路径,直接通过命令来调用这些文件。bin所执行的文件和参数那么说到这里你肯定会好奇这个文件是怎么做到生成模板的对吧,那么我们就来看一下被执行的这个文件到底是何方神圣 #!/usr/bin/env node const program = require('commander') program .version(require('../package').version) .usage('<command> [options]') .command('init', 'generate a new project from a template') .command('list', 'list available official templates') .command('build', 'prototype a new project') .command('create', '(for v3 warning only)') program.parse(process.argv)上边这一坨代码就是 执行vue init webpack 的文件所有内容 ...

October 4, 2019 · 2 min · jiezi

前端自动化测试一

目前开发大型应用,测试是一个非常重要的环节,但是大多数前端开发者对测试相关的知识是比较缺乏的。因为可能项目开发周期短根本没有机会写,所以你没有办法体会到前端自动化测试的重要性。 来说说为什么前端自动化测试如此重要! 先看看前端常见的问题: 修改某个模块功能时,其它模块也受影响,很难快速定位bug多人开发代码越来越难以维护不方便迭代,代码无法重构代码质量差增加自动化测试后: 我们为核心功能编写测试后可以保障项目的可靠性强迫开发者编写更容易被测试的代码,提高代码质量编写的测试有文档的作用,方便维护1.测试简介1.1 黑盒测试和白盒测试黑盒测试一般也被称为功能测试,黑盒测试要求测试人员将程序看作一个整体,不考虑其内部结构和特性,只是按照期望验证程序是否能正常工作白盒测试是基于代码本身的测试,一般指对代码逻辑结构的测试。1.2 测试分类单元测试(Unit Testing) 单元测试是指对程序中最小可测试单元进行的测试,例如测试一个函数、一个模块、一个组件... 集成测试(Integration Testing) 将已测试过的单元测试函数进行组合集成暴露出的高层函数或类的封装,对这些函数或类进行的测试 端到端测试(E2E Testing)打开应用程序模拟输入,检查功能以及界面是否正确 1.3 TDD & BDDTDD是测试驱动开发(Test-Driven Development) TDD的原理是在开发功能代码之前,先编写单元测试用例代码 BDD是行为驱动开发(Behavior-Driven Development) 系统业务专家、开发者、测试人员一起合作,分析软件的需求,然后将这些需求写成一个个的故事。开发者负责填充这些故事的内容,保证程序实现效果与用户需求一致。 小结: TDD是先写测试再开发 (一般都是单元测试,白盒测试);而BDD则是按照用户的行为来开发,再根据用户的行为编写测试用例 (一般都是集成测试,黑盒测试)1.4 测试框架Karma:Karma为前端自动化测试提供了跨浏览器测试的能力,可以在浏览器中执行测试用例Mocha:前端自动化测试框架,需要配合其他库一起使用,像chai、sinon...Jest:Jest 是Facebook推出的一款测试框架,集成了 Mocha,chai,jsdom,sinon等功能。...看到这里Facebook 都在推Jest,你还不学吗? Jest也有一些缺陷就是不能像Karma这样直接跑在浏览器上,它采用的是jsdom,优势是简单、0配置! 后续我们通过Jest来聊聊前端自动化测试。 2.Jest的核心应用在说Jest测试之前,先来看看以前我们是怎样测试的 const parser = (str) =>{ const obj = {}; str.replace(/([^&=]*)=([^&=]*)/g,function(){ obj[arguments[1]] = arguments[2]; }); return obj;}const stringify = (obj) =>{ const arr = []; for(let key in obj){ arr.push(`${key}=${obj[key]}`); } return arr.join('&');}// console.log(parser('name=zf')); // {name:'zf'}// console.log(stringify({name:'zf'})) // name=zf我们每写完一个功能,都先需要手动测试功能是否正常,测试后可能会将测试代码注释起来,这样会产生一系列问题。因为会污染源代码,所有的测试代码和源代码混合在一起。如果删除掉,下次测试还需要重新编写。 ...

September 9, 2019 · 2 min · jiezi

nrm-安装与配置

什么是 nrmnrm 是一个 npm 源管理器 安装 nrm命令: npm install -g nrm 全局安装 nrm 使用命令: nrm ls即可查看可以使用的源 其中,带 * 的是当前使用的源,上面显示的代表都是官方的源 使用 - 切换命令: nrm use taobao

September 6, 2019 · 1 min · jiezi

Cloud-Studio搭建Hexo

Cloud StudioCloud Studio是在线集成开发环境,它提供了完整的 Linux 环境, 并且支持自定义域名指向。IDE 中有近 20 种开发环境,支持一键切换,进度实时保存。 Hexo快速、简洁且高效的博客框架,Hexo依赖于Node.js,并且使用Markdown解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 随时随地搭建?我们都知道,Github、码云、Coding都免费提供了静态网页托管服务,我们写好的代码上传到托管平台,通过pages服务可以实现外网访问。文章开头所述,Cloud Studio提供了完整的 Linux 环境,并且进度实时保存,我们只要有浏览器就可以随时开发并且部署,配合Pages服务,不用买服务器,就可以拥有自己的博客系统。 说了这么多,就是想让大家了解一下工作原理,下面让我们开始吧!创建仓库首先,我们打开腾讯开发者平台)(需要注册腾讯云账号),点击右上角+号,新建项目。然后按照图示,开启pages服务。 新建工作空间打开Cloud Studio)官网,点击新建工作空间,来源选择“腾讯云开发者平台”,项目选择上一步创建的仓库,运行环境选择Hexo。 搭建Hexo生成所需文件由于我们选择的运行环境为Hexo,所以工作空间自带了Node.js、Git,hexo-cli。我们只需要运行以下命令就可以。 hexo init <folder>cd <folder> npm install启动服务器hexo cleanhexo dhexo s创建访问链接通过Cloud Studio右侧栏“访问链接”测试是否成功。 需要注意的是:端口改为4000,选择创建链接,然后点击创建的链接即可访问。部署到Pages安装 hexo-deployer-gitnpm install hexo-deployer-git --save修改 _config.yml 参数打开站点配置文件_config.yml,修改deploy属性。 deploy: type: git repo: https://gitee.com/giteetop/giteetop.git branch: masterrepo:你的仓库地址,可以是Github、Gitee以及Coding。部署hexo cleanhexo g -d过程中输入仓库的账号和密码,等待提交完成,然后就可以生成静态页面了。 常见问题如果生成静态页面后,发现页面没有样式了,这是因为使用了域名访问,但是没有配置url路径。打开站点配置文件_config.yml,修改url和root属性。 # URL## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'url: http://yoursite.com/root: /permalink: :year/:month/:day/:title/permalink_defaults:如果您的网站存放在子目录中,例如 http://yoursite.com/blog,则请将您的 url 设为 http://yoursite.com/blog 并把 root 设为 /blog/。

August 20, 2019 · 1 min · jiezi

什么是npm系列二install-的十八般武艺

本文同步发表于作者博客: 什么是npm系列:二、install 的十八般武艺我们平时使用npm install只是用来安装npm上的包,其实它比我们想象的更强大,不仅仅是安装npmjs上的包,还能够从git、gitlab直接安装,我们先看下install命令的参数列表: // 从npm源安装npm install npm install [<@scope>/]<name>npm install [<@scope>/]<name>@<tag>npm install [<@scope>/]<name>@<version>npm install [<@scope>/]<name>@<version range>// 从git源、tar包、本地目录安装npm install <git-host>:<git-user>/<repo-name>npm install <git repo url>npm install <tarball file or url>npm install <folder>1. npm install默认情况下,执行命令后会安装package.json中罗列的所有模块。 如果添加--production标记,或者环境变量NODE_ENV被设置为production,npm就不会安装devDependencies中的模块。 1.1 npm install <folder>通过symlink的形式,把包目录连接到项目中。 1.2 npm install <tarball file or url>从tar包装有两种方式: file : 本地tar文件npm install ./package.tgzurl : 远程tar的地址npm install https://github.com/indexzero/forever/tarball/v0.5.61.3 npm install <git remote url>另一个比较常见的方式是从git地址安装npm包,不过使用的时候需要注意仓库是否太大,以及源地址是否在外国,这些都会影响安装速度。 协议地址的格式如下: <protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]<protocol> 可以是 git, git+ssh, git+http, git+https, 或者 git+file. ...

August 19, 2019 · 1 min · jiezi

vue全家桶框架搭建

1.首先具备一定的前端基础,常规的HTML+CSS+Js/jqeury必须熟练,这是后期开发的基础。2.明白node是什么东西,明白npm能干什么。3.打开cmd窗口,我用的PowerCmd. node -v //检查是否安装nodenpm install webpack -g //webpack是一个包管理工具,也是vue-cli的构建工具,全局安装npm install --global vue-cli //vue-cli的安装,快速搭建项目的工具vue -V //查看vue-cli是否安装成功4.构建工程文件 vue init webpack projectName //'git' 不是内部或外部命令,也不是可运行的程序或批处理文件。下载git解决E:\>vue init webpack fristvue? Project name fristvue//项目名称(注意名称中不要出现大写字母,否则会报错)? Project description A Vue.js project//项目描述(可写可不写,看个人需要)? Author //作者(可写可不写,看个人需要)? Vue build standalone//vue编译,这个选默认即可,运行加编译Runtime + Compiler? Install vue-router? //Yes是否安装vue-router是否安装vue路由工具? Use ESLint to lint your code? //No是否使用代码管理工具ESLint管理你的代码? Set up unit tests //Yes设置单元测试? Pick a test runner //karma选择测试运行程序? Setup e2e tests with Nightwatch? //Yes? Should we run `npm install` for you after the project has been created? //项目创建后,我们应该为您运行“NPM安装”吗?使用cmd命令cd移动到项目根目录 ...

August 18, 2019 · 1 min · jiezi

如何结合npm做一个前端脚手架

背景需求:在日常开发中,随着项目越来越多,能重复利用的代码就越多,急需一套基本的模板来初始化项目,把代码放到自己的gitlab或github上,每次又得找到地址重新clone一下,很麻烦期望的结果:XXX init 。。。一行命令解决步骤:1、申请一个npm账号,https://www.npmjs.com/2、写一个npm项目package.json: { "name": "windssr", "version": "1.0.8", "description": "a tool service for react-ssr", "main": "index.js", "bin": { "windssr": "index.js" }, "author": "windseek", "license": "ISC", "dependencies": { "chalk": "^2.4.2", "co": "^4.6.0", "co-prompt": "^1.0.0", "commander": "^2.20.0" }, "scripts": { "test": "test" }, "repository": { "type": "git", "url": "git+https://github.com/Windseek/react-ssr-cli.git" }, "keywords": [ "react", "react-ssr", "wind-ssr", "react-ssr-cli" ], "bugs": { "url": "https://github.com/Windseek/react-ssr-cli/issues" }, "homepage": "https://github.com/Windseek/react-ssr-cli#readme"}init.js 'use strict'const exec = require('child_process').execconst co = require('co')const prompt = require('co-prompt')const config = require('./template.json')const chalk = require('chalk')module.exports = () => { co(function *() { // 处理用户输入 let tplName = yield prompt('Template name (you can input one like react, vue, angular): ') let projectName = yield prompt('Project name: ') let gitUrl,branch; console.log(config.tpl); if (!config.tpl[tplName]) { console.log(chalk.red('\n × Template does not support!')) process.exit() } gitUrl = config.tpl[tplName].url branch = config.tpl[tplName].branch // git命令,远程拉取项目并自定义项目名 let cmdStr = `git clone ${gitUrl} ${projectName} && cd ${projectName} && git checkout ${branch}` exec(cmdStr, (error, stdout, stderr) => { if (error) { console.log(error) process.exit() } console.log(chalk.green('\n √ Generation completed!')) console.log(`\n cd ${projectName} && npm install \n`) process.exit() }) })}index.js ...

July 26, 2019 · 1 min · jiezi

npm的scripts在Windows下无法并行或串行执行多命令的解决

我用MacOS开发,这个npm的scripts是可以很好的执行并行或者串行的脚本的,比如我们来看下我这个在MacOS下的正常执行的scripts代码段: "scripts": { "dev": "webpack --watch --config webpack.dev.js & npm run s", "build": "webpack --config webpack.prod.js", "prod": "webpack --config webpack.prod.js & npm run s", "lint": "eslint --ext ./src/*.js", "lintfix": "eslint --fix ./src/*.js", "sa": "nodemon ./servers/51la/server.js", "sb": "nodemon ./servers/jump/server.js", "sc": "nodemon ./server.js", "s": "npm run sa & npm run sb & npm run sc" },这里我执行npm run dev可以并行处理webpack --watch --config webpack.dev.js和npm run s,而执行后面的这个名领的时候又可以触发执行npm run sa & npm run sb & npm run sc,然后再次触发对应的三个命令。我暂时不关心他多层调用的问题。 ...

July 15, 2019 · 1 min · jiezi

如何解决npm-run-build后页面空白

欢迎关注前端小讴的github,阅读更多原创技术文章问题一:assetsPublicPath配置错误解决办法:打开config/index.js文件 build:{ // assetsPublicPath: '/' assetsPublicPath: './'} 问题二:路由history模式配置有误解决办法:关闭路由historym模式 export default new Router({ // mode: 'history', // require service support scrollBehavior: () => ({ y: 0 }), routes: constantRouterMap})

July 10, 2019 · 1 min · jiezi

实现一个自己的日志处理库并发布到npm

前言不折腾的前端不是一个好的前端,最近在搭建公司内部工具以及组件库,使用npm进行管理,所以学习一下如何创建一个属于自己的JavaScript库,并发布成npm模块。步骤创建账号点击进入npm官网 右上角进行注册 创建项目一路回车或者根据内容填写相关信息后,项目就创建好了。 package.json内容如下: 新建index.js文件(function (root, factory) { 'use strict'; if(typeof define === 'function' && define.amd){ define('log', [], factory); }else{ root['log'] = factory(); }})(this ? this : window, function(){ 'use strict'; const OFF = Number.MAX_VALUE; const DEBUG = 10; const INFO = 20; const WARN = 30; const ERROR = 40; function LogUtil(){ this.consoleLog = window.console; this._level = OFF; } LogUtil.prototype.setLevel = function(level){ if(!level){ return; } level = String(level).toLowerCase(); if(level === 'info'){ level = INFO; }else if(level === 'warn'){ level = WARN; }else if(level === 'error'){ level = ERROR; }else if(level === 'debug'){ level = DEBUG; }else{ level = OFF; } this._level = level; }; LogUtil.prototype.runLog = function(level, methodName, msg){ if(!level){ return; } var form = [new Date().toLocaleString(), level.toLowerCase(), methodName, msg].join('|'); if(level.toLowerCase() === 'debug' && this._level <= DEBUG){ this.consoleLog.debug(form); }else if(level.toLowerCase() === 'info' && this._level <= INFO){ this.consoleLog.info(form); }else if(level.toLowerCase() === 'warn' && this._level <= WARN){ this.consoleLog.warn(form); }else if(level.toLowerCase() === 'error' && this._level <= ERROR){ this.consoleLog.error(form); } }; return LogUtil;});到这里一个简单的包就创建好了。如果想再完善一下的话,还可以在包根目录下创建README.md文件,里面可以写一些关于包的介绍信息,最后发布后会展示在NPM官网上。 ...

July 9, 2019 · 1 min · jiezi

lerna管理package

最近发现公司一个项目的目录组织挺奇怪的,所有的子项目都放在了packages目录里,还有这种骚操作?特意查了下资料,发现是一种比较流行的monorepo项目管理模式。近几年比较火的React,Vue,Babel都是用的这种模式: 我们平常一般采用的都是multiple repositories的项目管理模式:把一个大项目拆分成若干个小项目,每个小项目都独立的放在gitlab上。这种模式其实也没啥不好,但是某些情况下,子项目A依赖子项目B,如果子项目B经常改动,那么每次B改动了,都要修改A,这时就非常麻烦。在开发一个前端框架或者UI库时,就经常会遇到上述情况,这时我们就可以考虑下monorepo。 monorepo说到底也只是一个理念,那么怎么才能实现这种代码组织呢? lernayarn中的Workspace本文主要介绍下lerna的使用 源码参考 lerna全局安装lerna npm i lerna -glerna是基于git的,在github上新建一个项目learn-lerna git clone git@github.com:deepred5/learn-lerna.gitcd learn-lerna初始化项目: lerna init lerna会自动创建一个packages目录夹,我们以后的项目都新建在这里面。同时还会在根目录新建一个lerna.json配置文件 { "packages": [ "packages/*" ], "version": "0.0.0" // 共用的版本,由lerna管理}创建package我们创建两个package: cd packagesmkdir prpr-lerna-corecd prpr-lerna-corenpm init -ycd packagesmkdir prpr-lerna-popularcd prpr-lerna-popularnpm init -y注意:这两个package我们最后都是要发布到npm上的,所以名字请取特殊些,不能被人用过 添加依赖prpr-lerna-popular依赖prpr-lerna-core,这时有两种方法添加依赖: 第一种方法是修改prpr-lerna-popular/package.json,添加 { "dependencies": { "prpr-lerna-core": "^1.0.0" }}然后运行lerna bootstrap 第二种方法是直接使用命令add lerna add prpr-lerna-core --scope=prpr-lerna-popular运行之后,我们发现prpr-lerna-popular生成了node_modules,而node_modules里生成了指向prpr-lerna-core的软链,类似npm link的效果: 新建prpr-lerna-core/index.js const API = 'https://yande.re/post/popular_recent.json';module.exports = { API}prpr-lerna-popular除了依赖prpr-lerna-core,还可以依赖其他开源的库,比如我们使用axios lerna add axios --scope=prpr-lerna-popular新建prpr-lerna-popular/index.js ...

July 9, 2019 · 1 min · jiezi

自动化执行npm-publishgit-commitgit-tagghpages全流程的shell

因为过程复杂和老忘记改版本号(╯‵□′)╯︵┻━┻,为简化自己提交开源工具而写的shell,记录一下。 用alias写在了.zshrc里,直接用 command [version] [commit/tag message] [subtreeDir]使用,[version]和[message]必须。 其中包含了自动修改版本号、git提交操作、tag操作、publish、提交gh-pages的subtree。 我的drag-block目前在用,前期准备工作如下: 在github上建库使用webpack打包,设置dev和prod环境build会把代码以及示例打包,分别放在lib/ 和 example/下需要一个npm账号在登录状态配置npm publish之前的ignore、files等建立gh-pages分支,并使用subtree将example/提交到该分支会得到: 一个github仓库github releases,可以用代码包的方式下载可以直接在npm install的工具一个github page,内容是你做的示例页面具体的可以从drag-block这里看。 #!/bin/sh if [ ! -n "$3" ];then subtreeDir="example/"else subtreeDir=$3fiif [ ! -n "$1" ];then echo '请输入版本号';else sed -i '' 's#\("version": "\).*#\1'"$1"'",#g' package.json # 修改package.json中的version npm run build git add . git commit -m "$2" git tag $1 -m "$2" git push git push --tags npm publish git subtree push --prefix=${subtreeDir} origin gh-pages # 使用subtree的方式提交我的 example/ 目录为gh-pages分支内容,用以github pages。fi

July 5, 2019 · 1 min · jiezi

13-个-npm-快速开发技巧

为了保证的可读性,本文采用意译而非直译。 每天,数以百万计的开发人员使用 npm 或 yarn 来构建项目。运行npm init或npx create- response -app等命令几乎构建JS项目的首选方式,无论是为客户端或服务器端,还是桌面应用程序。 但是npm不仅仅是初始化项目或安装包。在本文中,我们将会介绍 npm 的13个技巧来最大限度地利用npm:从简单的快捷方式到自定义脚本。 由于我们中的许多人每天都使用npm,从长远来看,即使节省少量的时间也会产生显著的影响。这些技巧是针对初学者和中级开发人员的,但是即使您是一位经验丰富的开发人员,我希望你仍然能够找到一到两个你以前没有遇到过的特性。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 主要内容学习基本快捷方式设置默认npm init属性让脚本跨平台兼容并行运行脚本在不同的目录中运行脚本延迟运行脚本直到端口准备就绪列出并选择可用脚本运行前后脚本控制应用程序版本从命令行编辑package.json自动设置和打开你的github库自定义npm init脚本使用自定义npm init脚本将你的第一个 Commit 提交到 GitHub1.学习基本快捷方式我们从最基本的开始,学习最常见的npm快捷方式从长远来将会节省很多时间。 安装 — 常规:npm install,简写:npm i。测试 — 常规:npm test,简写:npm t。帮助 — 常规:npm --help,简写:npm -h。全局标志 — 常规: --global,简写:-g。保存为开发依赖 - 常规: - save-dev,简写:-D。npm init 默认值 - 常规:npm init --yes 或 npm init --force,简写:npm init -y 或 npm init -f我们知道使用-save或-S来保存包,但现在这是个已经是默认值。要安装一个包而不保存它,可以使用 ——no-save标志。 不太常见的快捷键还有一些不常见的快捷方式,如下: 安装包信息将加入到optionalDependencies(可选阶段的依赖)- 常规:--save-optional, 简写:-O。精确安装指定模块版本 - 常规:--save-optional, 简写:-O。如果需要在本地保存一个npm包,或者通过单个文件下载选择一组可用的包,可以使用--save-bundle或-B将它们捆绑在一起,并使用npm pack获得捆绑包。 ...

July 4, 2019 · 3 min · jiezi

你可能不知道的-npm-实用技巧

作者: LeanCloud weakish 分享一些 npm 包管理工具的实用小窍门,希望能够略微提高下前端、Node.js 开发者的生活质量。绝大多数前端和 Node.js 开发者每天的日常工作都离不开 npm,不知道你对 npm 的观感如何?如果你觉得 npm 很棒,那么不妨看下这篇文章,说不定其中有你之前没留意过的小窍门,可以让你 npm 用得更顺手。如果你觉得 npm 很糟糕,那也可以看下这篇文章,也许会发现用上一些小技巧,npm 会变得稍微不那么糟糕。 npm ci别被它的名字骗了。npm ci 并不仅仅适用于持续集成系统,在日常开发中,npm ci 非常实用。和 npm install 不同,npm ci 根据 package-lock.json 安装依赖,这可以保证整个开发团队都使用版本完全一致的依赖,避免把时间浪费在排查因为依赖不一致而导致的各种奇怪问题上。不仅如此,npm ci 还有一个很好的副作用,加快 node 模块安装速度。因为 npm ci 直接根据 package-lock.json 中指定的版本安装,无需计算求解依赖满足问题,在大多数情况下都可以大大加速 node 模块安装过程。如果你曾经因为嫌 npm install 太慢而换用兼容性不那么好的 yarn 以及兼容性更不好的 pnpm,那么不妨试下 npm ci,也许你会发现,其实 npm 也可以不那么慢。 另外,如果 package-lock.json 过时(和 package.json 冲突),那么 npm ci 会很贴心地报错,避免项目依赖陷入过时状态。 有了 npm ci,基本上我只在引入新依赖时才使用 npm install。 ...

July 3, 2019 · 2 min · jiezi

微信小程序的jenkins发布构建

原文地址 环境准备微信开发者工具只支持macOS和Windows平台,所以jenkins也只能运行在这两个环境中。现在假设我们已经安装了jenkins,并且配置好了任务,大家可以参考微信小程序集成 Jenkins中的配置教程 配置mini-deploy插件在任务配置页面的 “构建” 中,选择 “执行 shell” ,贴入如下代码。 # 设置yarn源yarn config set registry https://registry.npm.taobao.orgyarn install # 删除构建文件并执行对应scriptsrm -rf dist && yarn run $build_type# 切换为jenkins帐号身份,这样写的原因是机器配置问题,可以忽略su jenkins <<'EOF' if [ "$build_type" == "prod" ] || [ "$build_type" == "build" ] then yarn run deploy --mode=upload --ver=$upload_version --desc=$upload_desc let "result |= $?" if [ "$result" == "0" ] then yarn run notify fielse yarn run deploy --mode=previewfiEOFyarn run notify为内部推送通知脚本yarn run deploy为mini-deploy的脚本,是本地安装调用方式mini-deploy同时也支持全局mini-deploy --workspace=/Users/xxx/WorkSpace/mini --mode=upload,执行时会检查project.config.json文件是否存在。 ...

July 2, 2019 · 1 min · jiezi

当使用npm-publish报4048时的解决文案

前段时间开发过一个npm包,发布在npm上。过了一段时间后修改了部分内容,需要再次发布。在执行npm publish时报错了。大概如下: npm ERR! path C:\Users\Admin\AppData\Local\Temp\npm-12284-cd09bc74\tmp\fromDir-8703ef80\package.tgznpm ERR! code EPERMnpm ERR! errno -4048npm ERR! syscall unlinknpm ERR! Error: EPERM: operation not permitted, unlink 'C:\Users\Admin\AppData\Local\Temp\npm-12284-cd09bc74\tmp\fromDir-8703ef80\package.tgz'npm ERR! { Error: EPERM: operation not permitted, unlink 'C:\Users\Admin\AppData\Local\Temp\npm-12284-cd09bc74\tmp\fromDir-8703ef80\package.tgz'npm ERR! cause:npm ERR! { Error: EPERM: operation not permitted, unlink 'C:\Users\Admin\AppData\Local\Temp\npm-12284-cd09bc74\tmp\fromDir-8703ef80\package.tgz'npm ERR! errno: -4048,npm ERR! code: 'EPERM',npm ERR! syscall: 'unlink',npm ERR! path: 'C:\\Users\\Admin\\AppData\\Local\\Temp\\npm-12284-cd09bc74\\tmp\\fromDir-8703ef80\\package.tgz' },npm ERR! isOperational: true,npm ERR! stack: 'Error: EPERM: operation not permitted, unlink \'C:\\Users\\Admin\\AppData\\Local\\Temp\\npm-12284-cd09bc74\\tmp\\fromDir-8703ef80\\package.tgz\'',报错内容说不允许操作,查了查发现原因是没有登录。那就登录呗。 ...

June 26, 2019 · 1 min · jiezi

文件-packagejson-的说明文档

Package.json文档复制 yarnpkg 官方文档,并不是完全复制,增加了一些内容和一些描述,作为笔记存储。你也可以参考 npm documentation, std-pkg, clean-publish, package-json-validator, cosmiconfig, rc。 欢迎 Star: https://github.com/jaywcjlove... 重要字段你的 package.json 中最重要的两个字段是 name 和 version,如果没有它们,您的包将无法安装。 name 和version 字段一起用于创建唯一ID。 name{ "name": "my-awesome-package"}这是您的 包 的名称。 它在URL中使用,作为参数命令行,以及 node_modules 中的目录名。 yarn add [包名]# ornpm install [包名]node_modules/[包名]https://registry.npmjs.org/[包名]/-/[包名]-[version].tgz规则 必须小于或等于214个字符(包括 @scope/ for 范围包)。不能以点(.)或下划线(_)开头。名称中不得包含大写字母。必须仅使用URL安全字符。Tips 不要使用和 Node.js 核心模块相同的名字。不要在名字里包含 js 或者 node 单词。短小精悍,让人看到名字就大概了解包的功能,记住它也会被用在 require() 调用里。保证名字在 npm registry 里是唯一的。version包的当前版本,严格遵循 Semantic Versioning 2.0.0 语义化版本规范。 { "version": "1.0.0"}信息类字段descriptionDescription 是帮助使用者了解包的功能的字符串,包管理器也会把这个字符串作为搜索关键词。 { "description": "我的包的概要简短描述"}keywords关键字是一个字符串数组,当在包管理器里搜索包时很有用。 { "keywords": ["short", "relevant", "keywords", "for", "searching"]}license所有包都应该指定许可证,以便让用户了解他们是在什么授权下使用此包,以及此包还有哪些附加限制。 ...

June 25, 2019 · 3 min · jiezi

Npm-Git

Gitgit addgit commitgit pushgit pullgit diff // 查看本地文件修改记录git revertgit reset Npmnpm installnpm run

June 24, 2019 · 1 min · jiezi

一个webpack构建速度优化误区

问题描述项目中使用了一个npm包a。前几天一直用得好好的,突然某次拉了别的分支代码后,就出Bug了。 第一反应是别人把这个包的版本变了。查看了下项目的package.json、package-lock.json文件,该模块和依赖模块的信息并没有改变,node_modules/a中的版本信息也和package.json中的对应。 一下子没了头绪,只好到node_modules中去调试一下。 TL;DR;拉到最后看总结 XD node_modules目录结构项目中node_modules目录如下: node_modules│└───a│ │ index.js| | ...│ ││ └───node_modules│ │ ...│ └───c| | index.js| | ...│ └───c │ index.js │ ...从该目录结构中可以发现,模块a的目录下还有一个node_modules目录,这个目录里放的是模块a的依赖。眼尖的同学可能发现了,项目本身的node_modules目录和a模块的node_modules目录中都有安装了模块c。这是为什么呢? 原因有2个: 项目直接依赖了模块c项目没有直接依赖模块c,但是项目直接依赖的模块b中依赖了模块c,并且和a中依赖的模块c版本不兼容。我们的项目中并没有直接引用模块c,所以是第二种情况。 npm的模块安装机制本节主要解释为什么项目没有直接依赖模块c,却会把c安装在项目的node_modules目录下。不感兴趣的同学可以直接跳过。 假设项目依赖了模块a和模块b,模块a依赖模块c的1.0.0版本,模块b依赖模块c的2.0.0版本。 npm2在npm2的时候,使用嵌套的方式来安装模块,c模块分别被安装到a和b模块的node_modules目录中。 这种方式虽然简单,但是却会导致node_modules中存在大量相同的模块。想象一下,如果模块a和模块依赖的模块c都是1.0.0版本,使用这种方式就会产生冗余的模块。 npm3到npm3的时候,npm2中产生冗余模块的情况得到改善。npm安装模块时会尽量把模块安装到最外层的node_modules目录中,让模块能够尽量被复用。 安装模块时,如果外层node_modules目录中没有同名模块,就将其安装到最外层ndoe_modules目录中如果外层node_modules目录中已经存在了同名模块,并且版本兼容,则不再安装(使用时直接使用外层模块)如果外层node_modules目录中已经存在了同名模块,并且版本不兼容,则安装在父模块的node_modules目录中上述情况的安装模块如图 引用了错误的模块到node_modules/a/node_modules/c/index.js中加了一些log,发现居然没执行!? 到这一步,要么是log的位置没写对,要么是没有引入这个模块。确认了webpack配置中的resolve.mainFields属性和模块c的package.json文件信息后,排除了第一种可能。 Tips: resolve.mainFields属性用来告诉webpack,引入一个npm模块时,如何找到这个模块的入口。 这时候已经有点懵了,引用模块时不是先从当前目录下的node_modules目录中开始一级一级向上查到吗?说到向上查找,那便到上一级的node_modules目录中去试一试。 果然!引用的是最外层node_modules中的模块c! 难道webpack查找模块的方式和Node.js不一样吗?还是因为webpack的某些配置导致的? 使用如下webpack配置来构建,发现并没有存在上述问题。 const path = require('path')module.exports = { entry: './src/index.js', output: { filename: 'main.js', path: path.resolve(__dirname, './dist/js') },};那接下来只要排查到底是哪些webpack配置影响到模块检索。查看项目中的webpack配置,和模块检索相关的只有resolve属性。 const config = { resolve: { modules: [ path.resolve(projectDir, 'src'), path.resolve(projectDir, 'node_modules'), path.resolve(imtPath, 'node_modules'), ], // es tree-shaking mainFields: ['jsnext:main', 'browser', 'main'], alias: {}, extensions: ['.jsx', '.js'], }}所幸配置不多,对着webpack文档查一下,很快便找到了问题:resolve.modules中使用了绝对路径。以下为webpack文档原文: ...

June 23, 2019 · 1 min · jiezi

linux

从github上下载代码git clone http://...进入下载的目录npm install此时有两个警告 npm run serve此时发现img目录底下有两个空文件夹没有(上传git时空文件夹被忽略),报错 手动创建文件夹重新npm run serve 搞定 ./configuremake&&make installnpm installnpm run servenpm run buildnpm run testnpm run lint

June 19, 2019 · 1 min · jiezi

Mac-升级-vue-3x-之前卸载-vue-296-失败的原因和解决方法

之前安装了 vue 2.9.6 的版本,现在 vue 官方升级到了 3.x 版本,所以想卸载掉 2.9.6 的版本,安装 3.x 版本,结果输入官方给出的命令 npm uninstall vue-cli -g 却无法成功卸载,一直提示 up to time in 0.03s,然后百度和 Google 了好久,也没见到有效的解决方法,最终沉下心慢慢的研究,终于知道了原因,记录下来,方便遇到相同问题的人。先介绍原因吧,可能大家都知道,npm 是 node 包管理器的简称(node package manager),在我们安装 node 的时候会一并安装。正常情况下,我们安装的 node 在 /usr/local/bin 目录下,而 npm 在 /usr/local/lib/node_modules 目录下,然后我们通过 npm 的全局命令安装的模块也在 /usr/local/bin 目录下(例如 npm install vue-cli -g),平时我们在终端里使用的 node --vesion 或者 vue --version 这种命令其实调用的就是 /usr/local/bin 中的命令。而我们使用 npm uninstall vue-cli -g 命令卸载 vue-cli 模块的时候,也是在这个目录去找,去卸载。但是如果我们在已经安装 vue 的情况下再安装 nvm(node 版本管理器,node version manager),就会出问题,nvm 会改变 npm 全局安装模块的路径,我这边的路径变成了 ~/.nvm/versions/node/v10.15.1/bin,在安装 nvm 之后我再使用 npm 的全局安装命令安装的模块全都在这个目录下。那么我们使用 npm uninstall vue-cli -g 命令去卸载 vue 当然是不会成功的,因为它是在 ~/.nvm/versions/node/v10.15.1/bin 目录去卸载,而我们的 vue 安装在 /usr/local/bin 目录下。那么知道了原因之后,就得解决问题了,下面的方法可能不是最好的,大家可以探索更好的方法。 ...

June 19, 2019 · 1 min · jiezi

修改npm全局安装包的位置解决EACCES权限拒绝问题

简介 在macOS系统下,npm默认的全局安装路径是在/usr/local/lib/node_modules下。例如:当我们执行npm i -g vue-cli时,实际上是把vue-cli这个模块安装到了/usr/local/lib/node_modules目录下了。 ⚠️注意: /usr/local/lib这个是系统目录,会有权限问题,虽然可以使用sudo执行,但是还是有部分机器,即使使用root用户执行npm i -g xxx 全局安装某个模块还是会出现EACCES permissions权限被拒绝问题。 ????解决办法: 通过修改npm全局安装模块的路径解决,将npm全局安装模块的路径,修改到当前登陆用户的HOME目录下即可,这样用不用sudo都不会出现EACCES permissions权限被拒绝问题了。 ⚠️️注意:本教程不适合Windows系统 操作0、查看当前npm的默认配置npm config ls1、在你的用户主目录下创建.npm-global文件夹作为npm全局安装的目录 mkdir ~/.npm-global2、修改npm使用新的全局安装路径npm config set prefix '~/.npm-global'3、修改PATH环境变量vim ~/.bash_profile //编辑.bash_profile文件,这个文件是用户登陆终端的时候会自动执行的文件4、在~/.bash_profile文件添加下面这行代码export PATH=~/.npm-global/bin:$PATH 5、更新系统变量,获取重启命令行终端 source ~/.bash_profile6、测试配置,在不使用sodu的情况下全局安装一个包npm install -g jshint 可以看到此后全局安装的模块都被安装到了/Users/jameswain/.npm-global目录下了 总结 其实解决全局安装模块权限不足问题的方法:主要是将npm全局安装模块的目录修改到了用户的主目录下,这样用户不需要sodu也能够全局安装模块,因为它是在自己的主目录下操作,永远不会存在权限问题。

June 17, 2019 · 1 min · jiezi

NPM你真的会吗一

什么是NPMnpm是什么东东?npm其实是Node.js的包管理工具(package manager)。为啥我们需要一个包管理工具呢?因为我们在Node.js上开发时,会用到很多别人写的JavaScript代码。如果我们要使用别人写的某个包,每次都根据名称搜索一下官方网站,下载代码,解压,script 引入,非常繁琐。于是一个集中管理的工具应运而生:大家都把自己开发的模块打包后放到npm官网上,如果要使用,直接通过npm安装就可以直接用,不用管代码存在哪,应该从哪下载。更重要的是,如果我们要使用模块A,而模块A又依赖于模块B,模块B又依赖于模块X和模块Y,npm可以根据依赖关系,把所有依赖的包都下载下来并管理起来。否则,靠我们自己手动管理,肯定既麻烦又容易出错。 npm的历史在没有npm的年代,你要去获取一个模块,或者一个框架你的方式是什么? 获取->JQ获取->Boottrap获取->Underscore我们的GitHub 当然当时也是一个jQuery可以走天下的时代我们程序员当然不能接受这种古老而且低效率的事情,我们需要更加高效更加合理的代码管理方式。 想想其他语言 语言包管理工具JavamavenPythondistribute、setuptools、distutils、easy_install、pipPHPComposer前端居然没有!不能容忍!在这个时候有个人站了出来 Isaac Z. Schlueter GitHub 下面简称(Issac) 大致的实现思路找一个云服务把所有的代码都管理起来然后通知 jQuery、Bootstrap、等等这些框架的坐着作者使用 npm publish 把代码提交到云服务上,社区里的其他人如果想使用这些代码,就可以通过npm install 来下载这些代码了。下载完的代码出现在 node_modules 目录里,就可以通过require引入进行使用了。后续发展Isaaz 通知 jQuery 作者 John Resig,他会答应吗?不一定这还是个未知数,但是还是要去做。只有前端开发工程师人人都知道有这个东西了才会认可它对不对。那npm是怎么迅速在前端社区火爆起来的呢?npm 的发展是跟 Node.js 的发展相辅相成的。Node.js 是由一个在德国工作的美国程序员 Ryan Dahl github地址 写的。他写了 Node.js,但是 Node.js 当时缺少一个包管理器,于是他和 Isaaz 一拍即合、,最终 Node.js内置了npm。后来的事情大家都知道,Node.js 火了。 package.json当我们在一个空文件 npm init 初始化的时候这个文件就诞生了, 我这里找了express 的 package.json { "name": "express", // 包名 "description": "Fast, unopinionated, minimalist web framework", // 包的描述 "version": "4.13.3", // 包的版本号 "author": { // 包的作者姓名 "name": "TJ Holowaychuk", "email": "tj@vision-media.ca" }, "contributors": [ // 包的其他贡献者姓名 { "name": "Aaron Heckmann", "email": "aaron.heckmann+github@gmail.com" } // ... ], "license": "MIT", // 你应该为你的模块制定一个协议,让用户知道他们有何权限来使用你的模块,以及使用该模块有哪些限制。 "repository": { // 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。 "type": "git", "url": "git+https://github.com/strongloop/express.git" }, "homepage": "http://expressjs.com/", // 包的官网 url "keywords": [ // 关键字 "express", "framework", "sinatra", "web", "rest", "restful", "router", "app", "api" ], "dependencies": { // 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下 "accepts": "~1.2.12", // ... }, "devDependencies": { // 开发环境的依赖包 "after": "0.8.1", // ... }, "engines": { // node版本范围 "node": ">= 0.10.0" }, "files": [ "LICENSE", "History.md", "Readme.md", "index.js", "lib/" ], "scripts": { // 项目的生命周期个各个环节需要执行的命令。key是生命周期中的事件,value是要执行的命令。 "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/", "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/", "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/", "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/" }, "gitHead": "ef7ad681b245fba023843ce94f6bcb8e275bbb8e", "bugs": { "url": "https://github.com/strongloop/express/issues" }, "_id": "express@4.13.3", "_shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3", "_from": "express@*", "_npmVersion": "1.4.28", "_npmUser": { "name": "dougwilson", "email": "doug@somethingdoug.com" }, "maintainers": [ { "name": "tjholowaychuk", "email": "tj@vision-media.ca" } // ... ], "dist": { "shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3", "tarball": "http://registry.npmjs.org/express/-/express-4.13.3.tgz" }, "directories": {}, "_resolved": "https://registry.npmjs.org/express/-/express-4.13.3.tgz", "readme": "ERROR: No README data found!"}那么你下次如果有这个package.json 你就可以直接下载安装这些依赖包。包文件就会出现在node_modules里面。 ...

June 16, 2019 · 2 min · jiezi

制作可全局执行的NPM包批量清理github仓库

不知什么时候开始,自家github堆满了仓库代码。。。各种demo开头的项目,还有些空仓库,啥都没写的。自然,程序员写的最差的代码就是以前写的代码了,为了维护心中美好的光辉形象,我决定—————— 不过,删除过程确实麻烦了些,身为“头脑简单,四肢发达” ,哦不对,“四肢简单,头脑发达”的程序员,怎么会甘心做苦力劳动呢?我决定搞个命令行批量执行下。 找到github API文档要删除当然是要找API啦,不过,我开始想的是用puppeteer无头chrome搞的,后来发现直接有API,就直接用喽。删除git仓库需要认证权限,我这里直接用Basic Auth验证,简单!Basic验证,简单说就是在请求头里,搞个Authorization:用户名:密码 命令行工具必须是要美美的命令行优化工具啦,I pick这个inquirer。 有一些带颜色的终端字看着还是ok的,所以还带上了chalk这个库。 just do it具体的代码,调用API,实在简单,看看就好: #!/usr/bin/env nodevar inquirer = require('inquirer');var axios = require('axios');var chalk = require('chalk');var log = console.log;var api = { user: async () => { return await axios({ url: 'https://api.github.com/user', method: 'GET', }); }, repos: async () => { return await axios({ url: 'https://api.github.com/user/repos', method: 'GET', }); }, deleteRepos: async (user, name) => { return await axios({ method: 'DELETE', url: `https://api.github.com/repos/${user}/${name}`, }); }, login: async () => { return await inquirer.prompt([ { name: 'username', message: 'username?' }, { name: 'password', type: 'password', message: 'password?' } ]); }, listRepos: async (repos) => { var list = []; repos.forEach(v => { var desc = v.description === null ? '' : v.description; list.push({name: v.full_name + ' ' + desc}); }); return await inquirer.prompt([ { type: 'checkbox', name: 'rep', message: 'select need cleared repos', choices: list } ]); }};(async () => { var inf = await api.login(); var base64 = new Buffer.from(inf.username + ':' + inf.password).toString('base64'); axios.interceptors.request.use(config => { config.headers = { Authorization: 'Basic ' + base64 }; return config; }); var user = await api.user(); log(`welcome ! ${chalk.green(user.data.name || user.data.login)}`); var repos = await api.repos(); var selectRepos = await api.listRepos(repos.data); for (var j = 0; j < selectRepos.rep.length; j++) { var name = selectRepos.rep[j].indexOf(' ') === -1 ? selectRepos.rep[j] : selectRepos.rep[j].substring(0, selectRepos.rep[j].indexOf(' ')); await api.deleteRepos(user.data.login, name); } log(chalk.green('successfull!'));})();npm打包发布就这样打包,肯定不会有全局执行文件滴。 ...

June 15, 2019 · 2 min · jiezi

node-npm-环境配置-从头来过

在 Node 使用中会安装各种模块儿,小编我作为技术小白并不知道npm cpm 安装在哪儿,全局安装的东西在哪儿。总会出现 '*不是内部或外部命令,也不是可运行的程序'这种提示,也不知道安装的包为什么会在“C:UsersAdminAppDataRoaming”,今天搜了好多,终于把环境配置弄好了,鉴于查到的资料很少,觉得自己的解决过程还是有参考意义的。 问题: webpack 不是内部命令等做法: 卸载node.js ,删除所有相关的环境变量,重新安装。描述:默认安装的情况下,会自动安装npm,系统环境会创建两个环境变量。 1 用户变量 PATH : C:UsersAdminAppDataRoamingnpm ;2系统变量:PATH:D:Program Filesnodejs; 如果不做改动,全局安装的东西会到C:UsersAdminAppDataRoamingnpm 下,如果有用淘宝镜像,那会到目录下的cnpm中。对于没有强迫症也要弄个明白的同学可能会希望全局安装到指定位置,那继续看。 解决过程: 1,安装node.js . 我的安装目录:D:Program Filesnodejs;2,在D:Program Filesnodejs目录下新建两个文件夹,用于存放全局安装包(node_global)和临时缓存位置(npm-cache); 3,查看你系统中全局的路径 npm root -g 4,设置全局路径(安装路径 缓存路径) npm config set prefix "D:Program Filesnodejsnode_global" npm config set cache "D:Program Filesnodejsnpm-cache" 5,重复3,查看你系统中全局的路径 npm root -g 如果是D:Program Filesnodejsnode_global就对了(我执行第五步执行了两次才设置好全局路径。(执行完毕后,环境变量 用户变量是不发生变化的)6,修改两个环境变量。6.1 用户变量 PATH : D:UsersAdminAppDataRoamingnpm 修改为 PATH : D:Program Filesnodejsnode_global6.2 系统变量:PATH:D:Program Filesnodejs; 修改为 PATH: D:Program Filesnodejs;D:Program Flesnodejsnode_global(多个配置,用英文;隔开) ...

June 14, 2019 · 1 min · jiezi

博客图片失效使用npm包20行代码一次下载替换所有失效的外链图片

前言大约一个月前,微博的图片外链失效了,以及掘金因为盗链问题也于2019/06/06决定开启防盗链,造成的影响是:个人博客网站的引用了这些图片外链都不能显示。 目前微博和掘金的屏蔽,在CSDN和segmentfault都是可以正常显示的,只影响个人博客。 比如前段时间我的博客:http://obkoro1.com上引用的微博图片都不能显示了。 因为我写博客比较频繁,被屏蔽的图片不在少数,肯定不能一个个手动的替换,查了一番没有找到现成的解决方案,做了个脚本工具,并且写了文档把它开源出来了。 markdown-img-down-site-change(下载/替换markdown中的图片)搜索目标文件夹中的markdown文件,找到目标图片,提供下载图片,替换图片链接的功能-通常用于markdown 图片失效。简介这是一个极为轻量的脚本,引用包,设置好参数,通过API即可轻松上手。 解决什么问题?集中下载markdown文件中某个域名下的图片到一个文件夹下。用新的图片链接替换markdown文件中某个域名的图片链接。// 1. 下载这两个图片// ![](https://user-gold-cdn.xitu.io/2019/5/20/图片名字?w=2024&h=1240&f=png&s=339262)// ![](https://user-gold-cdn.xitu.io/2018/6/16/图片名字)// 2. 替换成:github的链接![](https://raw.githubusercontent.com/OBKoro1/articleImg_src/master/juejin/图片名字?w=2024&h=1240&f=png&s=339262)![](https://raw.githubusercontent.com/OBKoro1/articleImg_src/master/juejin/图片名字)安装:npm i markdown-img-down-site-change -S文档:Github API 更新日志 数据安全:刚上手可能不了解脚本的功能,需要调试一番,这时候万一把markdown文件给改坏了,岂不是要哭死? 脚本有两种形式来防止这种情况发生: 脚本会默认备份你的文件。默认开启测试模式,等到调试的差不多了,可以关闭测试模式。建议:再不放心的话,可以先用一两个文件来测试一下脚本使用:20行代码不到在项目中有一个使用栗子,里面加了蛮多注释和空行的,实际代码20行都不到,可以说很简单了,如下: // npm i markdown-img-down-site-change -S const markdownImageDown = require('markdown-img-down-site-change'); // 文件模块// 传参: 这也是脚本的默认参数,根据情况可以自行修改let option = { replace_image_url: 'https://user-gold-cdn.xitu.io/', read_markdown_src: './source', // 要查找markdown文件的文件夹地址 down_img_src: './juejin', // 下载图片到这个文件夹 var_number: 3 // url前半部分的变量数量 比如上面的日期: /2019/5/20/、/2018/6/16/}// 初始化const markdownImage = new markdownImageDown(option)// 下载外链markdownImage.checkDownImg();// 上传下载下来的图片文件夹到云端 用户自己操作// 上传图片之后 // 脚本会把以前的外链替换成云端地址+拼接一个图片名markdownImage.updateOption({ new_image_url: 'https://xxx.com/目录地址/', // 图片上传的地址 add_end: '?raw=true' // github图片地址有后缀 直接进去是仓库})// 替换外链 // 把replace_image_url的字符串换成new_image_url字符串markdownImage.replaceMarkdown();运行:仔细阅读文本,配置好参数之后 ...

June 5, 2019 · 1 min · jiezi

npm-ERR-Cannot-find-module-accesserrorjs

最近npm install 经常出现这个问题。貌似是因为升级node版本导致的。 按照 https://stackoverflow.com/que... 这个解决方案,卸载npm,重新安装,然后重新安装了一下还是不行。 然后又把所有的node安装的都卸载掉,http://linyehui.me/2016/03/03...,也还是不行。。。 然后使用 nvm 安装 npm, npm 版本号是 v12.3.1,然后可以使用了,自以为解决了,然后又去另一个项目安装依赖,又出现这个错误,抓狂~!!() 尽量使用 nvm 去安装 node! 最后想到是不是npm版本太高,然后使用nvm,降低了版本,用的 v10.15.3 结果可以了。。。哭死。 注意: 1.需要把低版本的设为默认版本,不然启动别的项目还是有问题 2.切换项目的需要完全退出 VScode,重启终端,不然使用的还是旧的node版本

June 4, 2019 · 1 min · jiezi

基于-TypeScript-开发-NPM-模块

初始化 NPM 项目mkdir project-namecd project-namenpm init添加开发基础包添加 TypeScript yarn add typescript -D添加 Jest 测试工具 yarn add jest ts-jest @types/jest -D添加 @types/node yarn add @types/node -D初始化 TypeScript 配置./node_modules/.bin/tsc --init这会在你的项目根目录新建一个 tsconfig.json 文件 现在的目录结构如下: .├── node_modules├── package.json├── tsconfig.json└── yarn.lock文件解析tsconfig.json这是 TypeScript 的配置文件,默认仅启用了几项,我一般的配置如下: { "compilerOptions": { /* Basic Options */ "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, "lib": [ "es6" ] /* Specify library files to be included in the compilation. */, // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ "declaration": true /* Generates corresponding '.d.ts' file. */, "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, // "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "./dist" /* Redirect output structure to the directory. */, // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ // "composite": true, /* Enable project compilation */ // "incremental": true, /* Enable incremental compilation */ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ // "removeComments": true, /* Do not emit comments to output. */ // "noEmit": true, /* Do not emit outputs. */ // "importHelpers": true, /* Import emit helpers from 'tslib'. */ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ "strict": true /* Enable all strict type-checking options. */, "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, "strictNullChecks": true /* Enable strict null checks. */, "strictFunctionTypes": true /* Enable strict checking of function types. */, "strictBindCallApply": true /* Enable strict 'bind', 'call', and 'apply' methods on functions. */, "strictPropertyInitialization": true /* Enable strict checking of property initialization in classes. */, "noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */, "alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, /* Additional Checks */ "noUnusedLocals": true /* Report errors on unused locals. */, "noUnusedParameters": true /* Report errors on unused parameters. */, "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, /* Module Resolution Options */ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "typeRoots": [], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ /* Source Map Options */ // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ /* Experimental Options */ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ }, "include": ["./src/**/*"], "exclude": ["node_modules", "src/__tests__"]}package.json添加了几条 scripts: ...

May 29, 2019 · 6 min · jiezi

Monorepo大型前端项目的代码管理方式

最近我接手了一个项目,代码量比较大、有点复杂。仓库 clone 下来代码有 50+ MB,npm install 安装完体积飚到了近 2GB …… 熟悉了一下,这个项目比较复杂,采用了 monorepo 的方式进行代码的管理。折腾几天后,对 monorepo 也有个大概的了解…… MonorepoMonorepo 是管理项目代码的一个方式,指在一个项目仓库 (repo) 中管理多个模块/包 (package),不同于常见的每个模块建一个 repo。 目前有不少大型开源项目采用了这种方式,如 Babel: How is the repo structured?The Babel repo is managed as a monorepo that is composed of many npm packages.还有 create-react-app, react-router 等。可以看到这些项目的第一级目录的内容以脚手架为主,主要内容都在 packages 目录中、分多个 package 进行管理。 ├── packages| ├── pkg1| | ├── package.json| ├── pkg2| | ├── package.json├── package.jsonmonorepo 最主要的好处是统一的工作流和Code Sharing。比如我想看一个 pacakge 的代码、了解某段逻辑,不需要找它的 repo,直接就在当前 repo;当某个需求要修改多个 pacakge 时,不需要分别到各自的 repo 进行修改、测试、发版或者 npm link,直接在当前 repo 修改,统一测试、统一发版。只要搭建一套脚手架,就能管理(构建、测试、发布)多个 package。 ...

May 27, 2019 · 2 min · jiezi

包管理工具安装速度慢或许是-lock-文件的坑

包管理工具安装速度慢或许是 lock 文件的坑 ⭐️ 更多前端技术和知识点,搜索订阅号 JS 菌 订阅大家都用过 yarn npm 配置镜像加速第三方模块的安装。不知道有没有人遇到过无论怎么配置镜像,安装速度都贼慢的问题。 ???? 就这个很蠢的问题搞到我浪费了很多时间,少赚了几个亿 ???? 问题溯源(yarn 为例):想要降低安装速度只需这几步: ???? 第一次安装模块的时候并没有配置 config 中的镜像,而是直接从 registry.yarnpkg.com 中下载模块的,或许第一次安装速度并没有很慢,亦或者忘记配置 registry,总之就这么装了。并生成了一个 lock 文件锁定版本。 然后问题来了,另一个开发者换了一个网络环境需要重新安装模块,执行 yarn install 命令,速度就有可能会非常慢。即便是配置了 registry,仍然会走 lock 中锁定的 resolved 的安装源。 也就是可能会出现上述错误。 ⚠️ 解决办法:解决办法很简单: 像下面这样把 lock 文件中所有的 resolved 后的 url 全部替换成国内的镜像地址 ???? 这样安装速度就会灰常快了: ✈️ 可能出现的其他问题:上述方法基本上就能解决 lock 文件锁定安装源导致的速度慢的问题了,在安装过程中还可能出现 404 错误的问题: 这种情况找到 lock 文件中对应的模块,修改 resolved 值,换另一个镜像地址即可。 最后祭上大招: 请关注我的订阅号,不定期推送有关 JS 的技术文章,只谈技术不谈八卦 ???? ...

May 23, 2019 · 1 min · jiezi

npm-国内加速修改镜像源

为什么慢由于默认情况下执行 npm 各种命令是去国外的 npm 官方镜像源获取需要安装的具体软件信息,所以在不使用代理、不翻墙的情况下,从国内访问国外服务器的速度相对比较慢 可以通过以下命令快速查看当前 npm 使用的镜像源地址 npm config get registry默认输出结果应该是这样:https://registry.npmjs.org/如何修改镜像源阿里旗下维护着一个完整的 npm 镜像源 https://registry.npm.taobao.org/ 1. 临时修改npm install 软件名 --registry https://registry.npm.taobao.org/2. 全局修改npm config set registry https://registry.npm.taobao.org/3. 使用第三方软件快速修改、切换 npm 镜像源nrm NPM registry managernrm 不仅可以快速切换镜像源,还可以测试自己网络访问不同源的速度 安装 nrmnpm install -g nrm列出当前可用的所有镜像源nrm ls npm ----- https://registry.npmjs.org/ cnpm ---- http://r.cnpmjs.org/ taobao -- https://registry.npm.taobao.org/ nj ------ https://registry.nodejitsu.com/ rednpm -- http://registry.mirror.cqupt.edu.cn skimdb -- https://skimdb.npmjs.com/registry使用淘宝镜像源nrm use taobao测试访问速度nrm test taobao更多用法查看 nrm GitHub

May 22, 2019 · 1 min · jiezi

快速查看-npmyarn-全局安装过的包

npm、yarn 可以很方便的帮助我们快速安装开发前端项目需要的各种依赖包 同时也有意无意的安装了不少全局安装包,有些可能不会再使用了,有些已经太旧 使用以下命令查看自己电脑曾经安装过哪些全局工具包,顺便把那些不再需要的卸载掉吧 查看 npm 全局安装过的包$ npm list -g --depth=0/usr/local/lib├── npm@6.4.1├── nrm@1.0.2└── yrm@1.0.6查看 yarn 全局安装过的包$ yarn global list --depth=0yarn global v1.9.4info "@vue/cli@3.0.1" has binaries: - vueinfo "create-react-app@1.5.2" has binaries: - create-react-app✨ Done in 0.68s.npx 也许是个不错的选择如果有些包我们只会使用一次,或者只想尝试以下,不想安装到全局,也不想作为当前项目的依赖可以使用 npx 的方式来执行 npx 是 npm 5.2+ 版本之后自带的工具,能够帮助我们更高效的执行 npm 软件仓库里的安装包 更方便的执行当前项目中的可执行工具,比如:# npx 之前$ node ./node_modules/.bin/mocha# 使用 npx:$ npx mocha也可直接执行那些不在当前项目,也没在全局安装过的 npm 工具包,比如:create-react-app$ npx create-react-app my-app# 执行以上这条命令 npx 会按以下顺序工作:# 1. 先查看当前项目有没 create-react-app# 2. 如果当前项目找不到,会去全局查找 create-react-app# 3. 如果全局还找不到,会帮我们临时从 npm 包仓库安装 create-react-app,不会污染到当前项目,也不会装到全局✨ 重点推荐 ✨:对于那些不常使用、或者只想一次性尝试的工具,推荐使用 npx 的方式代替 npm install -g、yarn global 全局安装 ...

May 22, 2019 · 1 min · jiezi

npm系列手把手教你用npm发布第一个npm包的详细教程

我们已经实现了路由的自动化构建,但是我们可以看到,一大串代码怼在里面。当然你也可以说,把它封装在一个JS文件里面,然后使用 require('./autoRoute.js') 给引入进来,那也行。但是,为什么不把心放大一点呢?比如说,我们把它做成一个npm包! 最初自己做的时候就是这种直接引入封装的JS文件里,可以参考: https://github.com/saucxs/wat... 一、准备工作1、将npm包的镜像换成 https://www.npmjs.com/ npm config set registry https://www.npmjs.com/因为这个官方npm加载速度慢,之后再切换回来 npm config set registry https://registry.npm.taobao.org 2、自己电脑不是adminstrator权限,请切换到administrator用户。这个不需要告诉你怎么切换用户吧 3、注册一个npm账号 注册地址:https://www.npmjs.com/ 二、初始化要封装的包1、择一个文件夹,然后用命令行 cd进去 npm init接下来就是一长串表单: 1、name:填写你这个包的名字,默认是你这个文件夹的名字。不过这里要着重说一下,最好先去npm上找一下有没有同名的包。最好的测试方式就是,在命令行里面输入npm install 你要取的名字,如果报错,那么很好,npm上没有跟你同名的包,你可以放心大胆地把包发布出去。如果成功下载下来了。。。那么很不幸,改名字吧。。。 2、version:你这个包的版本,默认是1.0.0 3、description:这个用一句话描述你的包是干嘛用的,比如我就直接:‘watermark for dom 4、entry point:入口文件,默认是Index.js,你也可以自己填写你自己的文件名 5、test command:测试命令,这个直接回车就好了,因为目前还不需要这个。 6、git repository:这个是git仓库地址,如果你的包是先放到github上或者其他git仓库里,这时候你的文件夹里面会存在一个隐藏的.git目录,npm会读到这个目录作为这一项的默认值。如果没有的话,直接回车继续。 7、keyword:这个是一个重点,这个关系到有多少人会搜到你的npm包。尽量使用贴切的关键字作为这个包的索引。我这个包嘛,第一是在express下工作的,然后又是一个插件plugin,然后又是一个注册路由route用的,而这个路由又是基于文件目录dir,所以很好就得出我的包的索引关键字。 8、author:写你的账号或者你的github账号吧 9、license:这个直接回车,开源文件来着。。。 PS:你可以一直回车,之后再packjson里进行编辑这个表单。 2、然后,在目录下新建一个index.js文件,或者你刚才修改了那个entry point的值,那么你这个文件名也跟着改为那个值。 这个index.js里面我放了一个压缩的index.min.js。 3、然后,最重要的,写好README.md,一个给大家描述你的包的markdown文件,如果大家都不知道你的代码是做什么的,会有人去下载你的代码吗?哦,对了,最好写英文。我这里写了一套英文版的使用文档和一套中文版的使用文档。 三、npm命令登录接下来就是:用npm命令登陆一下: npm login登录的是自己注册的用户名和密码。 PS:或者使用添加npm用户 npm adduser四、npm发布到官方网上然后,在你的目录下使用 npm publishPS :每一次发布新的一版,version版本要改变,不然npm会给我报错。一般情况下,一旦你要修改你已经发布后的代码,然后又要执行发布操作,务必到package.json里面,把version改一下,比如从1.0.0改为1.0.1,然后在执行npm publish,这样就可以成功发布了。 五、看一下发布的包登录自己的npm官方,就可以看到自己发布的包 六、如何使用watermark-dom包(最后边是最重要的)npm包引入 第一步:获取水印组件包: npm install watermark-dom 第二步:引入水印模块:import watermark from 'watermark-dom' 第三步:在需要使用水印的页面js中调用水印初始化方法 watermark.init({ watermark_txt: "测试水印"});

May 21, 2019 · 1 min · jiezi

发布npm包踩坑

昨天试着发布npm包,遇到了问题,记录一下。 一:首先必须注册npm账号 用npm adduser 命令 npm ERR! code EAUTHUNKNOWNnpm ERR! Unable to authenticate, need: Basic把npm升级到6.9.0 ,报另一个错 npm ERR! code E401 npm ERR! Incorrect or missing password. npm ERR! If you were trying to login, change your password, create an npm ERR! authentication token or enable two-factor authentication then npm ERR! that means you likely typed your password in incorrectly. npm ERR! Please try again, or recover your password at: npm ERR! https://www.npmjs.com/forgot npm ERR! npm ERR! If you were doing some other operation then your saved credentials are npm ERR! probably out of date. To correct this please try logging in again with: npm ERR! npm login 继续百度,表面看样子是我密码不正确,其实因为重定向了npm库的源,所以npm adduser时会将用户名和密码提交到http://registry.npm.taobao.org 去验证 ...

May 15, 2019 · 2 min · jiezi

10秒钟构建你自己的造轮子工厂-2019年githubnpm工程化协作开发栈最佳实践

灵魂拷问:你有发布过npm包吗?发起过多人协作的github开源项目吗?据统计,70%的前端工程师从来没发布过npm包 对于初中级前端,维护开源项目是比较遥远的, 而前端工具的变化太快,高级前端也难以确定自己能写出开发栈的最佳实践,只能不断花时间摸索。 发起一个github/npm工程协作项目,门槛太高了!! 最基础的问题,你都要花很久去研究: 如何在项目中全线使用es2017代码? 答案是babel如何统一所有协作者的代码风格? 答案是eslint + prettier如何测试驱动开发,让项目更健壮? 答案是jest如何持续化集成,方便更多协作者参与项目? 答案是circleci这四样工具的配置,是每个github项目都会用上的。另外,gitignore配置editconfigreadmelisence。。。也是必不可缺的。 你可能需要花数天时间去研究文档、数天时间去做基础配置。 这样的时间成本,可以直接劝退大多数人。 然而,有的开发者,我们仰视的“神”,一年可以发上百个github/npm项目,其中更有几千上万的Star的大项目。 他们是正常人吗? 他们如何这样批量的造轮子的? 今天,这篇文章,让你第一次,拥有“神”的能力。 文章不是很长,但对你的前端生涯可能产生决定性影响,你会发现你与“神”之间的距离如此之近。 一切配置标准、正式、现代化。从此,你随手写的小工具、小函数,可以不断吸引协作开发者,膨帐成大型协作项目。就像当初的尤雨溪仿写angular时一样的起点。 你可以先来体验一下“轮子工厂”,在命令行输入: npx lunz myapp一路回车,然后试一试yarn lint,yarn test,yarn build命令 第一部分: 2019年github + npm工程化协作开发栈最佳实践 第二部分: 使用脚手架,10秒钟构建可自由配置的开发栈。 2019年github + npm工程化协作开发栈最佳实践我们将花半小时实战撸一个包含package.json, babel, jest, eslint, prettify, gitignore, readme, lisence的标准的用于github工程协作的npm包开发栈。 如果能实际操作,就实际操作。如果不能实际操作,请在bash下输入npx lunz npmdev获得同样的效果。 1. 新建文件夹mkdir npmdev && cd npmdev2. 初始化package.jsonnpm initpackage name: 回车version: 回车description: 自己瞎写一个,不填也行entry point: 输入`dist/index.js`test command: 输入`npx jest`git repository: 输入你的英文名加上包名,例如`wanthering/npmdev`keywords: 自己瞎写一个,不填也行author: 你的英文名,例如`wanthering`license: 输入`MIT`在package.json中添加files字段,使npm发包时只发布dist ...

May 13, 2019 · 7 min · jiezi

npm常用命令与操作

npm版本6.1.0 常用命令与操作1.安装模块npm i/install moduleName安装模块;i是install的缩写,两者功能是一样的npm i moduleName@0.0.1 安装模块的指定版本npm i moduleName --save 安装并保存至package.json文件的dependencies中npm i moduleName --save-dev 安装并保存至package.json文件的devDependencies中npm i moduleName -g 全局安装模块 2.查看已安装模块npm ls 查看所有局部安装的模块npm ls -g 查看所有全局安装的模块npm ls moduleName 查看指定模块的局部安装情况npm ls moduleName -g 查看指定模块的全局安装情况npm view moduleName 查看当前源中指定模块的信息npm view moduleName versions 查看当前源中指定模块的所有历史版本npm view moduleName version 查看当前源中指定模块的最新版本 3.卸载模块npm uninstall moduleName 卸载指定模块 4.更新模块npm update 按照package.json中的描述更新模块,且会在package.json文件中保存更新后的版本描述;^a.b.c更新至a下的最新版本,~a.b.c更新至a.b下的最新版本,a.b.c不会做任何更新npm update moduleName 更新指定模块 5.npm源查看与修改npm config get registry 查看当前npm源地址npm config set registry registryAddress 将npm源设置成相应的地址 6.万能的helpnpm help 当忘记了相应命令后,查看帮助 ...

May 10, 2019 · 1 min · jiezi

发布一个自己的NPM包

发布一个自己的NPM包用了这么多次别人发布的包,今天咱们自己发布一个npm包 首先检查npm源npm get registry# 如果不是这个地址https://registry.npmjs.org 需要设置官网源npm config set registry https://registry.npmjs.org如果是使用第三方源请设置npm官方源 (注):第三方源只提供下载功能 创建模块npm init # package.json 内容{ "name": "isnumber-lpz", "version": "1.0.0", "description": "Number\u001b[D\u001b[D\u001b[D\u001b[D\u001b[D\u001b[D\u001b[D\u001b[D\u001b[D\u001b[C\u001b[C\u001b[Cis\u001b[C\u001b[C\u001b[Number", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", "url": "git+https://github.com/lanpangzhi/isNumber-lpz.git" }, "author": "lanpangzhi", "license": "ISC", "bugs": { "url": "https://github.com/lanpangzhi/isNumber-lpz/issues" }, "homepage": "https://github.com/lanpangzhi/isNumber-lpz#readme"}# 创建 index.jstouch index.jsfunction isNumber(number) { number = parseFloat(number) return number === number && typeof number === 'number' }module.exports = isNumbernpm使用介绍里面有里面的字段,这里就省略了,(注):包的name不要重名建议先去[https://www.npmjs.com/](https://www.npmjs.com/)搜索下 ...

May 10, 2019 · 1 min · jiezi

搭建npm私库

选择搭建方案一、使用Sinopia由于 Sinopia 作者已经停止更新维护了,因此此方案pass掉 二、使用cnpmjs.org此方案相比较下面的第三种方案比较麻烦,而且cnpm已经不维护了,有很多问题都得不到解决,因此此方案也pass掉 三、使用verdaccio这是sinopia的一个分支,6种多语言文档详细齐全,搭建方法简单粗暴 1、安装verdaccio全局安装:npm i -g verdaccio 2、启动verdaccio启动命令:verdaccio 参数: --listen 端口号--config 配置文件路径栗子: verdaccio --listen 4000 --config ~./config.yaml 默认启动端口:4873,因此访问 http://localhost:4873 即可看到下面的内容 相关配置再来看看我们启动了verdaccio后控制台的相关输出 warn --- config file,这里告知我们配置文件的路径,我们可以去修改配置文件,配置文件说明如下:# 存放包的缓存目录 storage: /Users/xxx/.local/share/verdaccio/storage# 插件目录 plugins: ./plugins# 配置WEB UI界面web: # 默认开启 web 服务,如果想要关闭web服务,则设置 enable:false 即可 # enable: false # logo : logo.png # web 页面的标题 title: Efun FE NPM By Verdaccio # 验证信息auth: # 用户信息存储目录 htpasswd: file: ./htpasswd # 默认为1000,改为-1,禁止注册 # Maximum amount of users allowed to register, defaults to "+inf". # You can set this to -1 to disable registration. #max_users: 1000 # 公有库配置 a list of other known repositories we can talk touplinks: npmjs: url: https://registry.npmjs.org/# 配置权限管理packages: '@*/*': # 表示哪一类用户可以对匹配的项目进行安装 # 三种身份:$all 表示所有人都可以执行对应的操作,$authenticated 表示只有通过验证的人可以执行对应操作,$anonymous 表示只有匿名者可以进行对应操作(通常无用) access: $all # 表示哪一类用户可以对匹配的项目进行发布 publish: $authenticated # 代理,表示没有的仓库会去这个npmjs(又指向https://registry.npmjs.org/ ,就是上面的uplinks配置)里面去找 proxy: npmjs '**': access: $all publish: $authenticated proxy: npmjs# You can specify HTTP/1.1 server keep alive timeout in seconds for incomming connections.# A value of 0 makes the http server behave similarly to Node.js versions prior to 8.0.0, which did not have a keep-alive timeout.# WORKAROUND: Through given configuration you can workaround following issue https://github.com/verdaccio/verdaccio/issues/301. Set to 0 in case 60 is not enought.server: keepAliveTimeout: 60# 监听的端口 ,重点, 不配置这个,只能本机能访问listen: 0.0.0.0:4873# To use `npm audit` uncomment the following sectionmiddlewares: audit: enabled: true# 日志输出设置logs: - {type: stdout, format: pretty, level: http} #- {type: file, path: verdaccio.log, level: info}3、切换registry源直接更换所有npm下载源:npm set registry http://localhost:4873/只对本次装包指定下载源:npm install --registry http://localhost:4873推荐使用nrmnpm i nrm -gnrm list | nrm lsnrm add [name] [源url]nrm use [name]nrm del [name]4、账号管理创建账号:npm adduser --registry http://localhost:4873/登陆:npm login (需要先切换到对应npm源)退出:npm logout查看当前用户:npm who am i5、发布包npm publish升级版本号 ...

May 5, 2019 · 2 min · jiezi

Vuejs-构建你的第一个包并在NPM上发布

本文我们将学习如何制作一个vue插件,并将其分发到npm上,能够让其他人安装使用.插件大大地提高了开发者的开发效率。我们的大多数项目都依赖于它们,因为它们能够以极快的速度发布新功能。 正如官方Vue.js文档中所述,插件的范围没有限制。通常我们想实现的功能有下面5种: 添加全局方法或者属性 (如: vue-custom-element)添加全局资源:指令/过滤器/过渡等 (如:vue-touch)通过全局 mixin 方法添加一些组件选项 (如:vue-router)添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现 (如:vue-axios)一个库,提供自己的 API,同时提供上面提到的一个或多个功能(如:vue-router)OK,现在你了解了vue插件是什么了,以及它可以满足哪些需求! 如何在vue项目中使用插件通过npm install或yarn add安装插件后,你需要在main.js文件中导入它并调用Vue.use()全局方法。 注意:在new Vue() 前,必须先实例化所有插件.import Vue from "vue";import MyPlugin from "myplugin";Vue.use(MyPlugin);new Vue({// [...]})如果插件包支持cdn方式引用的话,也可以通过以下方式引用: <script src="https://cdn.xxx.cn/npm/myplugin@latest/dist/myplugin.min.js"></script>另外,在你调用Vue.use()时,想对插件做一些自定义配置,你可以这么做: Vue.use(MyPlugin, { option1: false, option2: true})举个例子,比如在引入热门的Element UI库时,它支持传入一个全局配置对象 import Element from 'element-ui';import 'element-ui/lib/theme-chalk/index.css';Vue.use(Element, { // size 用于改变组件的默认尺寸,zIndex 设置弹框的初始 z-index(默认值:2000) size: 'small', zIndex: 3000});现在让我们进入正题!开始构建你的第一个vue插件???? 来制作一个酷炫的按钮组件作为一个有追求的前端,相信你们在公司开发项目时,肯定会想过,"要是公司有属于自己的一套UI组件库,那肯定很棒!"。如果你有这个想法,那你认真看完这篇文章后,将会给你带来很多灵感和启发。 步骤 1:初始化插件目录结构先创建一个空的项目文件夹,名字随意取,然后初始化生成package.json文件(文件的内容后面会介绍) $ mkdir ku-button && cd ku-button$ npm init# 上面这个命令会提示一些问题,一直回车就行,然后最后会创建一个package.json文件然后在项目根目录中创建一个src文件夹,里面新建一个KuButton.vue组件,这里你甚至可以通过vue的vue serve和vue build命令行来对单个*.vue文件进行快速原型开发,不过前提需要先额外安装一个全局的扩展 ...

April 30, 2019 · 3 min · jiezi

npm-install-save-和-savedev-等常用命令的区别S-和D

几个常用命令# 安装模块到项目目录下npm install moduleName #-g 的意思是将模块安装到全局npm install moduleName -g #-save 的意思是将模块安装到项目目录下,并在package.json文件的dependencies节点写入依赖。npm install moduleName -save #--save-dev 的意思是将模块安装到项目目录下,并在package.json文件的devDependencies节点写入依赖。npm install moduleName --save-dev 注意: -g 、-save 、--save-dev 可以写在moduleName前面moduleName 可以是多个,空格隔开-save 可以简写为 -S--save-dev 可以简写为 -D 这四种命令对比npm install moduleName 安装模块到项目node_modules目录下。不会将模块依赖写入devDependencies或dependencies 节点。运行 npm install 初始化项目时不会下载模块。npm install moduleName -g 安装模块到项目node_modules目录下。不会将模块依赖写入devDependencies或dependencies 节点。运行 npm install 初始化项目时不会下载模块。npm install moduleName -save 安装模块到项目node_modules目录下。会将模块依赖写入dependencies 节点。运行 npm install 初始化项目时,会将模块下载到项目目录下。运行npm install --production或者注明NODE_ENV变量值为production时,会自动下载模块到node_modules目录中。npm install moduleName --save-dev 安装模块到项目node_modules目录下。会将模块依赖写入devDependencies 节点。运行 npm install 初始化项目时,会将模块下载到项目目录下。运行npm install --production或者注明NODE_ENV变量值为production时,不会自动下载模块到node_modules目录中。总结devDependencies 节点下的模块是在开发时需要用的,比如项目中使用的 gulp ,压缩css、js的模块。 这些模块在项目部署后是不需要的,所以我们可以使用 -save-dev 的形式安装。像 express 这些模块是项目运行必备的,应该安装在 dependencies 节点下,所以我们应该使用 -save 的形式安装。

April 30, 2019 · 1 min · jiezi

npm-scripts-使用指南

一、什么是 npm 脚本?npm 允许在package.json文件里面,使用scripts字段定义脚本命令。 { // ... "scripts": { "build": "node build.js" }}上面代码是package.json文件的一个片段,里面的scripts字段是一个对象。它的每一个属性,对应一段脚本。比如,build命令对应的脚本是node build.js。 命令行下使用npm run命令,就可以执行这段脚本。 $ npm run build# 等同于执行$ node build.js这些定义在package.json里面的脚本,就称为 npm 脚本。它的优点很多。 项目的相关脚本,可以集中在一个地方。不同项目的脚本命令,只要功能相同,就可以有同样的对外接口。用户不需要知道怎么测试你的项目,只要运行npm run test即可。 可以利用 npm 提供的很多辅助功能。查看当前项目的所有 npm 脚本命令,可以使用不带任何参数的npm run命令。$ npm run二、原理npm 脚本的原理非常简单。每当执行npm run,就会自动新建一个 Shell,在这个 Shell 里面执行指定的脚本命令。因此,只要是 Shell(一般是 Bash)可以运行的命令,就可以写在 npm 脚本里面。 比较特别的是,npm run新建的这个 Shell,会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。 这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Mocha,只要直接写mocha test就可以了。 "test": "mocha test"而不用写成下面这样。 "test": "./node_modules/.bin/mocha test"由于 npm 脚本的唯一要求就是可以在 Shell 执行,因此它不一定是 Node 脚本,任何可执行文件都可以写在里面。 npm 脚本的退出码,也遵守 Shell 脚本规则。如果退出码不是0,npm 就认为这个脚本执行失败。 ...

April 29, 2019 · 2 min · jiezi

处理公共模块-对比npm包和git-submodule

背景我们开发项目的时候,会经常碰到可服用模块,比如各种utils包,登录,分享之类的共有模块,并不想写在项目本身,而是抽出来可以为多个项目所复用。现在我们项目中用了俩种模式 把公共模块打包成npm包,使用时候利用npm install安装公共组件单独写成一个项目,使用时用git submodule引入到主项目中利用git submodule实现子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。 添加git子模块git 通过在 git submodule add 命令后面加上想要跟踪的项目 URL 来添加新的子模块。 $ git submodule add https://github.com/chaconinc/DbConnectorCloning into 'DbConnector'...remote: Counting objects: 11, done.remote: Compressing objects: 100% (10/10), done.remote: Total 11 (delta 0), reused 11 (delta 0)Unpacking objects: 100% (11/11), done.Checking connectivity... done.克隆含有子模块的项目接下来我们将会克隆一个含有子模块的项目。 当你在克隆这样的项目时,默认会包含该子模块目录,但其中还没有任何文件: $ git clone https://github.com/chaconinc/MainProject$ cd DbConnector/$ ls$其中有 DbConnector 目录,不过是空的。 你必须运行两个命令:git submodule init 用来初始化本地配置文件,而 git submodule update 则从该项目中抓取所有数据并检出父项目中列出的合适的提交。 ...

April 28, 2019 · 1 min · jiezi

npm 的 .npmrc 文件在哪里?缓存及全局包文件在什么位置?

前段时间,在git下载下来的项目,执行npm install时,频繁的报某一个包丢失,安装了相应的包之后,还会报其他的错误。同事帮忙,删除了npm缓存文件夹之后,重新执行npm install,OK了。特此对npm的配置情况坐下总结。 .npmrc配置文件快捷修改.npmrc配置文件npm config edit.npmrc配置文件地址 npm config listnpm缓存目录npm config get cachenpm全局node包位置npm config get prefix或者 npm root -g修改npm全局文件位置及缓存文件位置npm config set prefix "<new_path>"npm config set cache "<new_path>"参考https://newsn.net/say/npm-whe...

April 23, 2019 · 1 min · jiezi

写给前端的Python依赖管理指北

概述在Python的项目中,我们可以通过pip来安装依赖包,但是不像npm install,pip默认安装的依赖包会挂在全局上,不利于项目工程协作。 这时候需要一款类似npm的工具记录我们的项目依赖Pipenv。 安装Pipenv我们通过pip安装Pipenv: $ pip install pipenv安装之后,我们开始使用它来创建本地项目,为方便大家理解,将npm与Pipenv的使用方式进行对比。 创建本地项目Nodejs$ npm init --yes不同于Nodejs的npm,Python的Pipenv初始化项目需要经过两步: 创建虚拟环境激活虚拟环境Python$ pipenv install$ pipenv shell这时候Python会针对这个项目创建一个虚拟环境。项目下会出现一个文件 Pipfile,对应npm的 package.json 用于记录项目依赖信息。 安装依赖包当我们把自己的项目提交到git上,别人拉下工程后,就需要安装该工程的所有依赖: Nodejs$ npm installPython$ pipenv install当我们需要往项目添加新的依赖包,并记录到工程里: Nodejs$ npm install xxx --savePython$ pipenv install xxx安装到开发环境: Nodejs$ npm install xxx --save-devPython$ pipenv install xxx --dev最后通过pipenv我们可以像npm管理Nodejs工程一样管理python工程,更多细节可以参考pipenv官网:https://pipenv.readthedocs.io/en/latest/ 更多文章: https://www.zhihu.com/people/yonechen/posts

April 22, 2019 · 1 min · jiezi