为什么要建立私有npm

  1. 提高代码复用程度,增加团队沉淀
  2. 剥离项目依赖,工程更加轻量
  3. 引用全量更新,支持版本降级
  4. 建立模块文档,降低上手难度
  5. 全员把关代码质量,无需重复测试
  6. 构建工具已成趋势,优化发布流程,减少手动工作,提高团队效率
  7. 增强团队代码交流
  8. 内部保密机制

要做的工作

  1. 搭建私有 npm 环境
  2. 探索 npm 使用工作流
  3. npm 对接 OA,做好权限控制
  4. npm 上传规范制定
  5. 现有组件上传 npm 要做的改造
  6. 使用 git 维护源码库
  7. git 与 npm publish 联动,实现自动测试、构建、发布、回滚

基于cnpm的私有npm搭建

为什么选择 cnpm?

  1. taobao 出品,经过大流量考验
  2. 国内大多数公司部署私有 npm 的选择
  3. 完整接口,减低二次开发难度
  4. 部署友好,支持 msyql,数据迁移方便
  5. 较为完善的 markdown 支持,文档友好
  6. 完善客户端支持,丰富的工作流选项
  7. 实际上没有很多别的解决方案,官方工具需要使用 coachDB,sinopia 过于迷你,没有数据库支持,且对 markdown 支持不好

部署过程

// TODO 
// 其实已经搭建好了,超简单,有时间把详细过程下来:>

遇到问题

    1. 需要定义公司前缀,对项目侵入较大,使用了私有 npm 的项目必须使用 cnpm 安装,或指定 registry 安装,这就导致公共模块的包也会向私有 npm 请求,私有 npm 再从 taobao 源请求,可能会导致一定的延迟
    2. 需要在配置中指定管理员用户, 只有管理员用户才能 publish 项目,需要探索一下是否能够接入 oa 验证
    3. 默认界面太丑,可以优化一下,打上我们自己的标记

私有npm使用工作流

使用私有 npm 的几种方式

npm 有一个叫做 registry(源) 的配置项,类似于 linux 中的软件源的概念,这项配置指定 npm 应该以哪个地址为远程仓库,有了远程仓库,npm 才能够下载、发布这些代码。

所以,要使用私有 npm,就在于改变这个 regisitry 配置项,npm 为我们提供了两种方式来改变(也可能有多种,我常使用的就如下两种):

  1. 直接修改 npm 全局配置,如下:
  1. npm config set registry http://npm.corp.chinahr.com

这样的好处是一次修改,永久使用,不需要再次设置,缺点是,这个地址并不是随时随地可以访问,因为是公司内网地址,对开发者侵入较大。

  1. 在每次执行 npm 命令的时候,后面加上 --registry 参数。
  1. npm install vue --registry http://npm.corp.chinahr.com

这样做的好处是比较灵活,可以随意指定 registry 地址,并且本次生效,缺点是每次都需要手动输入 registry 地址。

所以这两种都不是完美的方案,cnpm 也提供了另外两种方案:

  1. 安装 cnpm 客户端(也是个 npm 程序),这个客户端包含了 npm 所有的命令,将这个客户端的 registry 设置为私有 npm 的地址,以后使用 cnpm 进行代替。
  2. 设置一个 alias 新命令,将私有 npm 的 registry 设置为默认,以后使用这个 alias 代替 npm 详细设置方法

这四方法都可以使用使用 私有 npm,每个方法的缺点是:

  1. 对开发环境侵入较大,如果没有公司内网环境,则无法使用 npm, 需要切换回来;
  2. 使用繁琐;
  3. 新引入一个命令,无法和现有脚手架和自动化工具融合,其实 2 也有类似问题;
  4. 同 3,而且对 windows 系统不友好。

所以还是并没有什么完美的解决方案,最推荐的方案是 3

在以后的文档说明中,cnpm 命令即代表正确地使用私有 npm

下载 package

和 npm install 没什么区别,只是需要在包名前面加上公司前缀 @chr/,这是因为 cnpm 的定位是一个 npm 镜像的全量同步工具,这样设置是防止与npmjs.org 中的 package 发生冲突 
例如:私有 npm 中有一个叫做 webpack 的包,下载的时候需要这样:

  1. cnpm install @chr/webpack

发布 package

发布 package 需要预先在配置文件中授权,这个等到咱们的 oa 接入了, 就可以配置好权限,做到所有人都可以发布。 
发布 package 的步骤:

  1. cnpm init  
    在这个模块下创建 package.json,让这个文件夹下的文件受 npm 管理,注意项目名称前应该加上@chr/
  2. 完善文档信息 
    修改项目的 README 文件,对项目做一个简要的说明
  3. 完善版本号 
    如果是初次发布的项目,版本号无需处理,如果是对项目进行更新,则应该先修改版本号,否则无法发布
  4. cnpm login 
    在命令行中登陆 npm,这个后期会和 oa 进行联动,现在的状态是,如果没有用户会自动注册,这里建议使用 oa 账号,方便以后对接。 
    5. cnpm publish 
     发布 package 
     

待解决的问题

    1. npm 会自动安装最新版本的 package,如果某个 package 版本更新通知没有做到位,可能会导致接口升级导致的现有代码受影响的情况

发布 package规范

搭建私有npm 最大的意义就是能够复用我们核心代码,提高开发效率,所以对上传上来的代码要有一个严格的规范,这样能够保证代码质量,减少沟通成本,防止协作的时候产生混乱。

这个规范需要一起来讨论制定,我先把我想到的几点写出来,大家一起完善

README.md

文档对于模块化项目来说十分重要,通过文档,调用者能够对项目的基本功能一目了然,迅速了解这个项目解决了什么问题、如何调用、存在什么问题,而不需要去与项目的维护者进行沟通。 
npm 有默认的 package 自文档管理方案,即通过项目内的 README.md 
项目文档应该至少包含以下几个方面:

  1. 解决了什么问题
  2. 包含那些组件
  3. 如何调用
  4. 有哪些配置项
  5. 存在哪些问题
  6. 更新计划: 长期/快速迭代

example

应该包含其中项目中各个方法的示例程序

测试

作为基础模块,单元测试必不可少,基础模块也很适合做单元测试

测试这块,我没有什么经验,大家可以一起探索

review

重要模块的更新及上线,应该由团队大多数人进行 review

npm script

更新通知 

私有npm计划的更多相关文章

  1. 搭建前端私有npm杂记

    随着前端队伍越来越壮大,项目间共享代码就变得尤为重要.常用的框架/类库没必要在每个项目都放一份,团队内部产出的公共模块也需要有合理的共享机制.现在,用npm管理前端代码已经是业界趋势.楼主尝试用私有n ...

  2. 使用cnpm搭建企业内部私有NPM仓库

    cnpm是企业内部搭建npm镜像和私有npm仓库的开源方案.它同时解决了现有npm架构的一些问题. 为什么企业需要私有NPM 主要有如下理由: 确保npm服务快速.稳定:对于企业来说,上线生产系统的时 ...

  3. 利用Sinopia搭建私有npm包

    1.安装sinopia包 npm install -g sinopia 如果是Windows系统用上面的方式安装sinopia很有可能报错,推荐使用下面方式安装: npm install sinopi ...

  4. 【玩转树莓派】使用 sinopia 搭建私有 npm 服务器

    简介 使用 sinopia 的好处是,node系的工程师,内部协作时,使用自有 npm 包,会非常方便:另外,sinopia,会缓存已经下载过的包,可以在相当程度上,加速 npm install 相关 ...

  5. 如何安装私有 npm 包?

    安装私有 npm 包的步骤: 先安装私有 npm 包:npm install <npm包名> --registry=<npm包源> 然后运行npm install安装公共 np ...

  6. NodeJS学习:搭建私有NPM

    工具 verdaccio nrm pm2 特点 verdaccio 的特点: 不同步拉取npm库,占据大量硬盘,没有硬盘被撑爆的问题: 安装配置极其简单,不需要数据库: 支持配置上游registry配 ...

  7. 搭建私有npm私库(使用verdaccio)

    搭建 npm 离线服务器 为什么要搭建npm 服务器 原因: 公司内部开发的私有包,统一管理,方便开发和使用 安全性,由于公司内部开发的模块和一些内容并不希望其他无关人员能够看到,但是又希望内部能方便 ...

  8. 使用Sinopia搭建私有npm仓库

    使用Sinopia搭建私有npm仓库 在用npm装包的时候,每次都要下载一大堆,慢且不说,npm还老被墙,所以就想到在公司内部搭建npm仓库镜像.大概看了几个,觉得Sinopia最简单也好用,所以就使 ...

  9. 基于Docker部署私有npm

    NPM作为前端最cool及最烂的包管理器,它解决困扰前端工程化发展中代码模块管理的大问题.但是随着业务需求的发展,我们的代码从以前的单项目复用,延伸出了多项目复用的需求.本来项目之间代码复用管理的情景 ...

随机推荐

  1. Java学习笔记【八、数据结构】

    参考资料: http://www.cnblogs.com/janneystory/p/5758958.html array arraylist list linklist的区别 http://www. ...

  2. php基本变量

    结构体和联合体 struct(结构体) 和 union(联合体) 结构体是8字节对齐,不够8字节的部分则空出来: 联合体共用一个8字节,共享这8字节的内存,后使用的会覆盖先使用的 结构体和联合体在形式 ...

  3. Mysql(三)-1:存储引擎

    一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型 ...

  4. java开发技巧

    1,IDEA辅助功能Shift +F2去到有错误的地方Alt+Enter,会给出解决错误的建议: 2,调试,没问题的步骤,直接跳过,不要跳入细节: 调试时,要明确要跟踪的变量,不要陷入混乱: 3,调试 ...

  5. 【u-boot】u-boot对设备树的节点解析(转)

    1,设备树的引入2,uboot本身对设备树的支持3,对uboot中设备树节点解析代码的分析 (1)上一篇文章中提到函数 dm_init_and_scan(bool pre_reloc_only) 中有 ...

  6. redis主从配置及其java的调用(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/gsying1474/article/de ...

  7. C# 数据类型转化为byte数组

    short数据与byte数组互转 public byte[] ShortToByte(short value) { return BitConverter.GetBytes(value); } pub ...

  8. nodejs基础一

    Node.js是一个基于Chrome V8引擎的JavaScript运行. js的运行环境 运行js有两种: .js文件方式 交互(REPL): node  回车进入交互模式 .exit 退出交互模式 ...

  9. Cannot use JSX unless the '--jsx' flag is provided.

    在tsx文件中加入html代码后,报错 Cannot use JSX unless the '--jsx' flag is provided. 解决方法: 在tsconfig.json中加入: &qu ...

  10. 【Winform-自定义控件】可以使用2种半透明的颜色来填充Button

    制作一个自定义按钮,使用2种半透明的颜色来填充Button 1.添加一个自定义控件类,并改变基类,继承自Button public partial class CustomControl1 : But ...