前端知识库(lizh)
  • README
  • Bugs
    • 前端调试随笔
    • 浏览器常见问题概览
    • 浏览器兼容问题概览
    • HTML常见问题概览
    • CSS常见问题概览
    • JS常见问题概览
    • 移动端兼容性问题概览
    • 微信小程序开发
    • NodeJs常见问题概览
    • Mac常见问题概览
    • 微信开发遇坑指南
    • Npm包常见问题概览
    • 其他问题汇总
  • Css探索系列
    • CSS基础知识
    • CSS常见问答
    • CSS常见问答02
    • CSS应用示例
    • CSS应用示例02
    • 由Z Index引发的层叠上下文思考
    • 由浮动塌陷引发的块级格式上下文思考
    • CSS探索系列 Flex布局
    • CSS探索系列 Margin
    • CSS探索系列 Auto关键字
    • CSS探索系列 Gradient
    • CSS探索系列 Line Height
    • CSS探索系列 元素居中
    • CSS探索系列 动画
    • 为什么使用PostCSS处理CSS?
    • 重新认识伪类与伪元素
    • 自定义表单伪元素样式
    • 如何理解Css中的Display属性
    • 视口和软键盘对视口的影响
    • 关于Css
  • Frontend
    • 00 关于Web前端
    • 01 前端知识概览
    • 02 常用前端库概览
    • 基础 00 前端常见问题01
    • 基础 01 浏览器缓存
    • 基础 02 浏览器工作原理
    • 基础 03 谈谈前端跨源问题及解决方法
    • 进阶 01 Web性能优化
    • 进阶 02 搜索引擎优化(SEO)
    • 进阶 03 前端模块化编程
    • 进阶 04 规范代码:Linter、Prettier、EditorConfig
    • 进阶 11 前端自动化测试
    • 高级 01 前端安全
    • Vue2.X原理篇
    • Vue3初步了解及迁移指南
    • 重读Vue教程
    • React17.X原理篇
    • 你必须知道的React问题
    • 重读React教程
    • 聊一聊Cookie的一些问题
    • 如何理解HTTP响应的状态码
    • HTTP的历史演变及概述
    • Webpack4.X原理篇
    • Webpack基础入门篇
    • Webpack构建优化篇
    • TypeScript使用指南
    • 代码规范
      • 前端规范
      • HTML
      • CSS
      • JS
  • Html探索系列
    • HTML基础知识
    • HTML基础知识02
    • HTML常见问答
    • HTML经典实践用例
    • HTML元素的宽高及位置详解
    • Video元素的使用和常见问题总结
    • Html探索系列 Meta标签
    • DOCTYPE:文档类型与浏览器模式
    • DHTML(动态网页)简介
    • HTML标签详解
    • HTML布局的几种方式
    • HTML全局属性
    • 关于Html
  • Js探索系列
    • 基础知识
    • 常见问答
    • 应用示例
    • 趣味示例
    • 基础篇 05 AJAX
    • 基础篇 06 Window对象
    • 基础篇 07 Error、JSON、Math、Console对象
    • 基础篇 08 History、URL、Screen、Navigator、Location对象
    • 基础篇 09 文档对象模型(DOM)
    • 基础篇 10 Document对象
    • 基础篇 11 Element对象
    • 基础篇 12 Event对象
    • 基础篇 13 键盘、鼠标、触摸事件
    • 基础篇 15 CSS对象模型(CSSOM)
    • 进阶篇 01 Prototype对象和继承
    • 进阶篇 02 Promise对象
    • 进阶篇 07 迭代器(Iterator)
    • 进阶篇 08 Generator和Async函数
    • 进阶篇 09 JavaScript异步编程
    • Date对象和日期时间字符串格式
    • Canvas基础入门篇
    • Canvas进阶篇
    • SVG基础入门篇
    • 四种判断数据类型方法的优缺点
    • 深入理解JavaScript的浅拷贝和深拷贝
    • 谈谈JavaScript的作用域和上下文
    • 复制内容到剪贴板
    • 关于Javascript
  • NodeJs
    • 关于Node.Js
    • Node.Js:三种调试方法
    • Npm包管理器简介及一些机制
    • NPM:Package.Json详解(中文)
    • NPM:从零开始,开发一个软件包
    • NPM:常用命令
    • Node.Js:Fs(文件系统)
    • Node.Js:Global(全局变量)
    • Node.Js:HTTP
    • Node.Js:Module(模块)
    • Node.Js:Path(路径)
    • Node.Js:Readline(逐行读取)
  • Research
    • 极细边框(1px边框)实现方式
    • 如何监控前端异常?
    • H5页面跳转和刷新
    • Web主题切换和个性化定制方法总结
    • Vue SSR(服务端渲染)的简单实现
    • 基于Create React App打造代码规范化的React+Ts项目
    • H5可视化编辑
    • Web常用功能
    • Javascript加密混淆
    • Vue如何导入TypeScript
    • 移动端PDF预览
    • 纯CSS绘制箭头
    • 网站性能测量和优化方法
  • Tech
    • GOOGLE浏览器的搜索技巧
    • Curl的用法指南
    • Sublime3插件篇
    • Charles安装及使用
    • Nginx基础使用
    • 排序算法(Javascript)
    • 代码整洁之道(摘录笔记)
    • Java的24种设计模式与7大原则
    • 观察者和发布订阅模式
  • Tools
    • Git
      • Git基础教程
      • Git常见问题
    • Gitbook
      • Gitbook入门篇
      • Gitbook插件篇
      • Gitbook进阶篇
由 GitBook 提供支持
在本页
  • 初始化项目
  • 开发
  • 测试
  • 发布
  • 使用
  • 权限转让
  • 相关问题
  • 参考资料

这有帮助吗?

  1. NodeJs

NPM:从零开始,开发一个软件包

上一页NPM:Package.Json详解(中文)下一页NPM:常用命令

最后更新于1年前

这有帮助吗?

(Node Package Manager) 本来是 Node.js 的包管理工具,但随着JS这几年的蓬勃发展,现在 npm 已经成为了几乎所有跟 JS 相关的工具和软件包的管理工具,并且还在不断的发展完善中。

现在最新版的 Node.js 的安装都会自带npm,装上Node.js就可以使用npm。

初始化项目

发布一个 npm 代码包,本质上就是将你的代码公开在 https://www.npmjs.com/ 网上。使用者可以通过 npm install [npm包名],来引入你的代码。关键在于两点:

  • 输出的 Js 文件,也就是代码主体。如:通常输出到``lib/index.js`。

  • package.json 配置中指明你的输出文件的位置。这个是通过main属性来指定的

初始化项目,就是要创建一个 package.json 文件,其中模块的名字和版本号是必填项。可以手动创建,也可以用 npm init 自动创建。

package.json部分字段说明:

{
  name: '', //插件的名字
  version: '', //插件版本号
  description: '', //插件描述
  author: '', //作者名
  main: '', //入口文件路径,require(name)将根据这个路径来引入
  files: '', //文件夹名,所有文件都会被包含进项目中(除非是那些在其他规则中被忽略的文件)
  bin: {}, //许多包有一个或多个可执行文件希望被安装到系统路径。提供一个bin字段,它是一个命令名和本地文件名的映射。在安装时,如果是全局安装,npm将会使用符号链接把这些文件链接到prefix/bin,如果是本地安装,会链接到./node_modules/.bin/。
  keywords: '', //关键词,使用数组形式,方便npm官网搜索
  scripts: {}, //命令行,通过npm run 执行
  license: '', //许可证书,一般开源是MIT
  homepage: '', //项目主页的url
  repository: '', //github仓库项目地址
}

开发

这个可以很灵活,具体开发取决由 npm 包的复杂度。

  • 可以是简单的,直接在lib文件夹下,创建一个只有一行代码的console.log(Hello World!)的JS文件;也可以采用webpack + vue之类的框架,开发一个复杂的项目,将最终编译出来的JS文件输出到lib文件夹。

  • 可以给项目加eslint等代码校验

  • 编写测试模块,如:mocha 和 chai

  • 可以用gitlab CI类的方式实现自动化部署

  • 可以创建readme.md文档,编写使用说明

测试

相对路径安装

进入测试项目目录,用相对路径安装包。安装完后,可以在 node_modules 文件夹检查是否安装成功。

cd [项目目录]
npm install [包的相对路径]

npm link 测试

相对路径安装找路径比较麻烦,所以我们推荐使用 npm link 将 npm 包链接到全局,再安装到本地项目。

首先,定位到 npm 包项目的目录下,运行 npm link。

cd [npm包项目]
npm link
# 执行后,输出/usr/local/lib/node_modules/[插件项目名称] -> /Users/${whoami}/Documents/[插件项目路径]/[插件项目名称]

意思是将 npm包项目 连接到全局的 node_modules 下(全局 node_modules 目录下可以看到该 npm 包)。

然后,定位到需要测试项目,运行 npm link [package-name],将 npm 包安装到当前项目。npm 包的修改,在 build 后,会同步更新到当前项目的 node_modules。

cd [需要使用 npm 包的项目目录]
npm link [package-name]
# /Users/[whoami]/Documents/[project-path]/node_modules/[package-name] -> /usr/local/lib/node_modules/[package-name] -> /Users/[whoami]/Documents/[project-path]/[package-name]

测试完成后,在 npm 包项目取消连接:

cd [npm包项目]
npm unlink

发布

  • 注册:npm adduser

  • 判断是否登录:npm whoami

  • 登录:npm login

  • 发布:npm publish。每次发布,必须修改版本号。版本号更新,要遵循 Semver(语义化版本号) 规范:

    • 升级补丁版本号:npm version patch

    • 升级小版本号:npm version minor

    • 升级大版本号:npm version major

  • 删除:**根据规范,只有在发包的24小时内才允许撤销发布的包。**即使是你删除了,也只是无法被搜索到,仍可以通过链接直接访问。

    npm unpublish --force

使用

安装:npm install [npm包名]

使用:import "[npm包名]或者import Obj, {Obj1, Obj2} from 'npm包名'

权限转让

要使用 CLI 将软件包传输给另一个 npm 用户,请依次运行 npm owner add 和 rm 命令。

npm owner add <their-username> <package-name>
npm owner rm <your-username> <package-name>

如果您为写入启用了双重身份验证,则将一次性密码添加到参数 --otp:

# 其中123456是来自身份验证器应用程序的代码
npm owner add <their-username> <package-name> --otp=123456
npm owner rm <your-username> <package-name> --otp=123456

相关问题

npm link 失败

实际场景一: 将正在开发的 npm 包,通过 npm link 引入业务项目中调试时报错:

Module build failed: TypeError: Invalid PostCSS Plugin found at: plugins[0]

原因是包所在的项目中的 postcss 配置文件中的一些插件,在业务项目中没有安装。

解决方法: 一是修改 npm 包项目的 postcss 配置文件;二是业务项目中,忽略项目外的配置文件。

实际场景二: node 版本原因。

如果使用类似 nvm 的 Nodejs 的版本管理器,默认情况下,nvm 会为您安装的每个节点版本创建一个不同的全局 node_modules 文件夹。

运行时 npm link,将使用项目中使用的特定版本的节点来创建链接,这意味着只有使用相同版本节点的项目才能访问本地版本的依赖项。更令人沮丧的是,npm link 在发生这种情况时不会抛出错误。

解决方法: 在开发的 npm 包项目和业务项目,运行 nvm use 命令,使用相同的 Nodejs 版本。注意:即使用 node -v 命令查看,两个项目的 Nodejs 版本是相同的,也建议重新指定下相同版本。

实际场景三: 如果业务项目运行 npm i 安装了其他包,需要重新运行 npm link [package-name]。

npm publish报错

报错[no_perms] Private mode enable, only admin can publish this module [no_perms] Private mode enable, only admin can publish this module

**出现原因:**使用的是淘宝源cnpm,登陆到的是npm

**解决方法:**切换到 npmjs 的网址,代码如下:npm config set registry http://registry.npmjs.org/。也可以用nrm管理源。

参考资料

image-20201103231118837

npm
package.json参数详解
Why Your npm link Commands Might Be Failing