如何发布 npm 包
(给前端大全加星标,提升前端技能)
转自:kkk 爱学习
juejin.cn/post/6911853807756378125
npm是什么?
npm 是Node 的模块管理器,功能极其强大。它是Node 获得成功的重要原因之一。正因为有了npm,我们只要一行命令,就能安装别人写好的模块。
npm install
npm install:https://docs.npmjs.com/cli/install 命令用来安装模块到node_modules
目录。
$ npm install <packageName>
--save-dev -D 本地
--save -S 生产
-g 全局
$ npm uninstall <packageName>
安装之前,npm install
会先检查,node_modules
目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。
如果你希望,一个模块不管是否安装过,npm 都要强制重新安装(不需要删掉nodemodules),可以使用-f
或--force
参数
$ npm install <packageName> --force // 强制更新
npm update
如果想更新已安装模块,就要用到 npm update:https://docs.npmjs.com/cli/update 命令。
$ npm update <packageName>
它会先到远程仓库查询最新版本,然后查询本地版本。如果本地版本不存在,或者远程版本较新,就会安装。
模块的安装过程
发出 npm install
命令npm 向 registry 查询模块压缩包的网址 下载压缩包,存放在 ~/.npm
目录解压压缩包到当前项目的 node_modules
目录
npm常用指令
npm init --yes(初始化配置) -y
npm i (会根据package.json里面的键dependencies,devDependencies来安装相对应的包)
npm i 包(默认安装一个最新的包,这个包在node_modules文件夹里面,并且会更新在你的package.json文件)
npm i 包@3.0.0(安装一个指定版本的包,会更新在你的package.json文件)
npm i 包 --save-dev(安装一个开发环境所需要的包,会更新在你的package.json文件) -D
npm i 包 --save(安装一个生产环境所需要的包,会更新在你的package.json文件) -S
npm uninstall 包(卸载一个包,会更新在你的package.json文件)
npm update 包(更新此包版本为最新版本,会更新在你的package.json文件)
npm run 脚本键(会根据package.json里面的"scripts"里面的脚本键自动执行相对于的值)
npm publish (根据package.json的name发布一个包) 发布到npm仓库
npm unpublish 包名 --force(卸载npm网站上自己上传的包)
packageJson文件配置
{
"name": "axios", //发布的包名,默认是上级文件夹名。不得与现在npm中的包名重复。包名不能有大写字母/空格/下滑线!
"version": "2.2.2",//你这个包的版本,默认是1.0.0。对于npm包的版本号有着一系列的规则,模块的版本号采用X.Y.Z的格式,具体体现为:
1、修复bug,小改动,增加z。
2、增加新特性,可向后兼容,增加y
3、有很大的改动,无法向下兼容,增加x
"description": "用来请求接口,懂了吗二货", // 介绍
"main": "index.js",// 入口文件,默认是Index.js,可以修改成自己的文件,这个很重要,当你在实际项目使用的时候,let a = require("包名"),它就去会去找对应的文件路径哦。
"scripts": { // 快捷命令,在package.json同目录下输入命令 npm run 键 就会执行 相对应的命令
"bulid": "npx webpack --config myConfig.js",
"start": "xxx",
//例如 输入 npm run bulid 就会执行npx webpack --config myConfig.js的命令 。
// npm start 省略run
},
"keywords": [],
"author": "王二蛋",
"license": "ISC",// 这个直接回车,开源文件协议吧,也可以是MIT,看需要吧。
"dependencies": { // 生产环境所依赖的包
"jquery": "^3.4.1",
"sea": "^1.0.2"
},
"devDependencies": { // 开发环境所依赖的包
"webpack": "^4.41.6"
}
}
更改npm默认的下载路径和缓存路径
npm config ls 命令可查看npm的安装信息以及默认的下载路径。
D:\software\cmder\cmder>npm config ls
; cli configs
metrics-registry = "https://registry.npmjs.org/"
scope = ""
user-agent = "npm/6.13.4 node/v12.14.0 win32 x64"
; builtin config undefined
prefix = "C:\\Users\\DELL\\AppData\\Roaming\\npm"
; node bin location = D:\SoftWareInstall\nodejsIns\node.exe
; cwd = D:\software\cmder\cmder
; HOME = C:\Users\DELL
; "npm config ls -l" to show all defaults.
注意,npm默认的下载路径在C:\Users\DELL\AppData\Roaming\npm,其中AppData是隐藏文件夹,在【查看】菜单中勾选【隐藏的项目】才可以看到AppData文件夹。
// 更改npm默认的缓存路径
npm config set cache "D:\TempDate\nodedata\cache"
// 更改npm默认的下载路径
npm config set prefix "D:\TempDate\nodedata\download"
更改缓存路径和下载路径后,再次查看
D:\software\cmder\cmder>npm config ls
; userconfig C:\Users\DELL\.npmrc
cache = "D:\\TempDate\\nodedata\\cache"
prefix = "D:\\TempDate\\nodedata\\download"
那么下面来介绍一下,如何创建自己的第一个node模块,并把这个模块上传到npm上面,让别人可以用我们的模块
创建第一个node模块
Node.js模块就是发布到npm的代码包,
创建一个新模块的第一步就是创建一个package.json文件。你可以用npm init来创建package.json文件。这个过程中命令行会逐步提示你输入这个模块的信息, 其中模块的名字和版本号是必填项
你还需要一个入口文件, 如果你使用默认值的话,那就会是index.js. 创建完package.json文件之后,你就要开始写代码包里的内容了, 这里举个最简单的例子,在默认的index.js里写一个要导出的函数, 这个函数也就是别人的代码里可以import或者require的。
exports.showMsg = function () {
console.log("This is my first module");
};
这样的话,你的node模块就已经创建完成了
如何发布到npm服务器上
注册一个npm账号
首次需要登录,npm login 存储证书到本地,后面就不需要每次都登录的
登录需要输入用户名,密码,还有邮箱,这些都是刚刚注册时候填写的
开始发布
npm publish 发布包
使用 cnpm 的注意报错:no_perms Private mode enable, only admin can publish this module 设置回原本的就可以了 **npm config set registry registry.npmjs.org ** 发布完成之后,如果还想回到之前的cnpm,使用下面的命令 npm config set registry registry.npm.taobao.org
创建一个案例,引用刚上传的包
假设已经成功发布了,并且包名叫做toniqian-test-module, 这时候可以新建一个空目录,cd进去,运行npm install toniqian-test-module,然后在这个目录下会出现一个叫node_modules的文件夹,你之前写的包就会出现在这个文件夹下面。
然后写一个index.js,代码如下
var test = require('toniqian-test-module');
test.showMsg();
运行index.js
node index.js
那么刚刚上传的包,目前已经可以使用,到目前的话, 你已经成功创建了一个npm包了
如何更新npm包
当你包的内容修改之后,比如
exports.showMsg = function () {
console.log("This is my second module");
};
复制代码
修改了提示文字,那么我们需要 npm version <update_type> update_type就是版本号的意思,会自动更新package.json里面的版本号 然后重新 npm publish,更新就会完成
作业 实现一个相对时间转换函数
moment(time){
// 相对时间转换
}
如何删除npm包
npm unpublish kk-a-test --force
查看当前登录的npm账号
npm whoami
输出 username
发布包错误集锦
1、需要提高版本号
#1、发包 npm publish 失败
sh-neverleave:z-tool neverleave$ npm publish
npm ERR! publish Failed PUT 400
npm ERR! code E400
npm ERR! deprecations must be strings : z-tool
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/neverleave/.npm/_logs/2018-11-23T10_52_01_742Z-debug.log
sh-neverleave:z-tool neverleave$ npm publish
#2、发包 npm publish 失败
sh-neverleave:z-tool neverleave$ npm publish
npm ERR! publish Failed PUT 403
npm ERR! code E403
npm ERR! You cannot publish over the previously published versions: 1.0.3. : z-tool
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/neverleave/.npm/_logs/2018-11-23T11_24_57_662Z-debug.log
sh-neverleave:z-tool neverleave$
2、发包 npm publish 失败 解决方案:终端执行:npm publish --access public
参考:https://stackoverflow.com/questions/53420758/npm-publish-gives-unscoped-packages-cannot-be-private
#1、发包 npm publish 失败
sh-neverleave:npm neverleave$ npm publish
npm ERR! publish Failed PUT 400
npm ERR! code E400
npm ERR! unscoped packages cannot be private : z-tool
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/neverleave/.npm/_logs/2018-11-23T08_44_21_310Z-debug.log
sh-neverleave:npm neverleave$
#解决方案:终端执行:npm publish --access public
sh-neverleave:npm neverleave$ npm publish --access public
+ z-tool@1.0.0
sh-neverleave:npm neverleave$
3、确保登录的用户账号正确
sh-neverleave:npm neverleave$ npm publish
npm ERR! publish Failed PUT 404
npm ERR! code E404
npm ERR! 404 User not found : z-tool
npm ERR! 404
npm ERR! 404 'z-tool' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/neverleave/.npm/_logs/2018-11-23T07_32_28_518Z-debug.log
4、登录时需要在username 前加‘~’,具体大家可以验证
sh-neverleave:npm neverleave$ npm login
Username: (~neverleave) neverleave
Password: (<default hidden>)
Email: (this IS public) (1063588359@qq.com)
npm ERR! code EAUTHIP
npm ERR! Unable to authenticate, need: Basic
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/neverleave/.npm/_logs/2018-11-23T07_27_50_877Z-debug.log
sh-neverleave:npm neverleave$
5、无权限删除线上的包(撤包有时间限制,24小时) 解决方案:加上 --force
sh-neverleave:z-tool neverleave$ npm unpublish z-tool
npm ERR! Refusing to delete entire project.
npm ERR! Run with --force to do this.
npm ERR! npm unpublish [<@scope>/]<pkg>[@<version>]
sh-neverleave:z-tool neverleave$
#解决方案(内部有被鄙视的话,😄 I sure hope you know what you are doing.)
sh-neverleave:z-tool neverleave$ npm unpublish z-tool --force
npm WARN using --force I sure hope you know what you are doing.
- z-tool
sh-neverleave:z-tool neverleave$
6、删除npm市场的包同名的24小时后才能重新发布
sh-neverleave:z-tool neverleave$ npm publish
npm ERR! publish Failed PUT 403
npm ERR! code E403
npm ERR! z-tool cannot be republished until 24 hours have passed. : z-tool
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/neverleave/.npm/_logs/2018-11-23T11_41_24_086Z-debug.log
sh-neverleave:z-tool neverleave$
- EOF -
觉得本文对你有帮助?请分享给更多人
推荐关注「前端大全」,提升前端技能
点赞和在看就是最大的支持❤️