npm包管理

npm其实是Node.js的包管理工具(node package manager)。

为啥我们需要一个包管理工具呢?因为我们在Node.js上开发时,会用到很多别人写的JavaScript代码。如果我们要使用别人写的某个包,每次都根据名称搜索一下官方网站,下载代码,解压,再使用,非常繁琐。于是一个集中管理的工具应运而生:大家都把自己开发的模块打包后放到npm官网上,如果要使用,直接通过npm安装就可以直接用,不用管代码存在哪,应该从哪下载。

更重要的是,如果我们要使用模块A,而模块A又依赖于模块B,模块B又依赖于模块C和模块D,npm可以根据依赖关系,把所有依赖的包都下载下来并管理起来。否则,靠我们自己手动管理,肯定既麻烦又容易出错。

npm的基础使用

npm的指令其实常用的并不多官方文档;列出来如下面:

  • access
    Set access level on published packages
  • adduser


    Add a registry user account
  • audit


    Run a security audit
  • bin


    Display npm bin folder
  • bugs


    Bugs for a package in a web browser maybe
  • build


    Build a package
  • bundle


    REMOVED *已删除*
  • cache


    Manipulates packages cache
  • ci


    Install a project with a clean slate
  • completion


    Tab Completion for npm
  • config


    Manage the npm configuration files
  • dedupe


    Reduce duplication
  • deprecate


    Deprecate a version of a package
  • dist-tag


    Modify package distribution tags
  • docs


    Docs for a package in a web browser maybe
  • doctor


    Check your environments
  • edit


    Edit an installed package
  • explore


    Browse an installed package
  • help-search


    Search npm help documentation
  • help


    Get help on npm
  • hook


    Manage registry hooks
  • init


    create a package.json file
  • install-ci-test


    Install a project with a clean slate and run tests
  • install-test


    Install package(s) and run tests
  • install


    Install a package
  • link


    Symlink a package folder
  • logout


    Log out of the registry
  • ls


    List installed packages
  • npm


    javascript package manager
  • outdated


    Check for outdated packages
  • owner


    Manage package owners
  • pack


    Create a tarball from a package
  • ping


    Ping npm registry
  • prefix


    Display prefix
  • profile


    Change settings on your registry profile
  • prune


    Remove extraneous packages
  • publish


    Publish a package
  • rebuild


    Rebuild a package
  • repo


    Open package repository page in the browser
  • restart


    Restart a package
  • root


    Display npm root
  • run-script


    Run arbitrary package scripts
  • search


    Search for packages
  • shrinkwrap


    Lock down dependency versions for publication
  • star


    Mark your favorite packages
  • stars


    View packages marked as favorites
  • start


    Start a package
  • stop


    Stop a package
  • team


    Manage organization teams and team memberships
  • test


    Test a package
  • token


    Manage your authentication tokens
  • uninstall


    Remove a package
  • unpublish


    Remove a package from the registry
  • update


    Update a package
  • version


    Bump a package version
  • view


    View registry info
  • whoami


    Display npm username

init

初始化创建package.json

npm init [--force|-f|--yes|-y|--scope]
npm init <@scope> (same as npx <@scope>/create)
npm init [<@scope>/]<name> (same as npx [<@scope>/]create-<name>)

search

搜索查看远程npm相关资源包信息

npm search [-l|--long] [--json] [--parseable] [--no-description] [search terms ...]
aliases: s, se, find

install

可以是说是install是最为常见的命令官方介绍

npm install (with no args, in package dir)
npm install [<@scope>/]<name>
npm install [<@scope>/]<name>@<tag>
npm install [<@scope>/]<name>@<version>
npm install [<@scope>/]<name>@<version range>
npm install <git-host>:<git-user>/<repo-name>
npm install <git repo url>
npm install <tarball file>
npm install <tarball url>
npm install <folder>

alias: npm i
common options: [-P|--save-prod|-D|--save-dev|-O|--save-optional] [-E|--save-exact] [-B|--save-bundle] [--no-save] [--dry-run]

In global mode (ie, with -g or --global appended to the command), it installs the current package context (ie, the current working directory) as a global package. The -g or --global argument will cause npm to install the package globally rather than locally.

The -f or --force argument will force npm to fetch remote resources even if a local copy exists on disk.

上面的还介绍已经很详细了,所以这里只是讲一下npm install packageName [|--save |--save-prod|--save-dev]的区别;

  • npm install babel
    npm5以前,会把X包安装到node_modules目录中,不会修改package.json的dependencies字段,之后运行npm install命令时,不会自动安装X
  • npm install babel
    npm5以后,会把X包安装到node_modules目录中,会修改package.json的dependencies字段,之后运行npm install命令时,会自动安装X, 线上环境时会被安装
  • npm install babel -P
    -P, --save-prod: Package will appear in your dependencies. This is the default unless -D or -O are present. Package will appear in your dependencies, With the --production flag (or when the NODE_ENV environment variable is set to production), npm will install modules listed in dependencies.
  • npm install babel -D
    Package will appear in your devDependencies,With the --production flag (or when the NODE_ENV environment variable is set to production), npm will not install modules listed in devDependencies. 会把X包安装到node_modules目录中,会在package.json的devDependencies属性下添加X,之后运行npm install命令时,会自动安装X到node_modules目录中,之后运行npm install –production或者注明NODE_ENV变量值为production时,不会自动安装X到node_modules目录中

update

升级某个资源包或者全部资源包到某一个版本或者匹配的最新版本。

npm update [-g] [<pkg>...]
aliases: up, upgrade

uninstall

移除某个资源包

npm uninstall [<@scope>/]<pkg>[@<version>]... [-S|--save|-D|--save-dev|-O|--save-optional|--no-save]
aliases: remove, rm, r, un, unlink

npm包创建、编写、测试、维护

Node出现之前,JavaScript是缺少包结构的。CommonJS致力于改变这种现状,于是定义了包的结构规范。而NPM的出现则是为了在CommonJS规范的基础上,实现解决包的安装卸载,依赖管理,版本管理等问题。require的查找机制明了之后,我们来看一下包的细节。
一个符合CommonJS规范的包应该是如下这种结构:

  • 一个package.json文件应该存在于包顶级目录下
  • 二进制文件应该包含在bin目录下(可选)
  • JavaScript代码入库是index.js,其他包含在lib目录下
  • 文档应该在doc目录下(可选)
  • 单元测试应该在test目录下(可选)

初始化包

  1. 创建包的根目录


    mkdir testpackage
  2. 初始化


    npm init // 需要进行一些基本配置

编写

  1. 创建入口文件


    touch index.js
  2. 编写代码


    const updateQueryString = function(url, key, value) {
    let urlParts = url.split('#'),
    hash = '',
    uri = urlParts.shift(),
    re = new RegExp(`([?&amp;])${key}=.*?(&amp;|$)`, 'i'),
    separator = uri.indexOf('?') !== -1 ? '&amp;' : '?',
    encodeKey = encodeURIComponent(key),
    encodeValue = encodeURIComponent(value); urlParts.length &gt; 0 &amp;&amp; (hash = `#${urlParts.join('#')}`); if (uri.match(re)) {
    return uri.replace(re, `$1${encodeKey}=${encodeValue}$2`) + hash;
    } else {
    return `${uri}${separator}${encodeKey}=${encodeValue}${hash}`;
    }
    }; // 最后的导出部分
    module.exports = {
    updateQueryString
    };
  3. 测试

    1. 创建包的根目录


      npm i mocha -D // 安装测试库
      npm i chai -D // 安装断言库
      mkdir test
      cd test
      touch index.test.js
    2. 编写测试代码


      const utils = require('./../index.js');
      const expect = require('chai').expect; let {
      updateQueryString
      } = utils; describe('updateQueryString函数的测试', function() {
      it('https://test.com/path?test=11 修改test参数为22 应该等于 https://test.com/path?test=22', function() {
      expect(updateQueryString('https://test.com/path?test=11', 'test', 22)).to.be.equal('https://test.com/path?test=22');
      });
      });
    3. 运行测试


      cd ..
      ./node_modules/mocha/bin/mocha

npm包的发布

  1. 注册账号npm官网
  2. 终端执行 npm login,输入用户名和密码 、邮箱
  3. npm publish 发布

Organization包

我们经常可以看到@angular@ionic他们的包, 都可以以@开头,那么我们的可不可以,原来angular、ionic都属于一个组织(Organization)只有新创建一个Organization组织之后,才能创建@testorg/testpackname这样的包!!!

那么我们就可以去官网上创建我们的Organization,命名之后,官方步骤

  1. 初始化


    npm init --scope=&lt;your_org_name&gt;

    npm init foo -> npx create-foo
    npm init @usr/foo -> npx @usr/create-foo
    npm init @usr -> npx @usr/create

  2. 修改package.json里面的name字段为@your_org_name/<pkg_name>
  3. 发布


    npm publish --access public // 公开包发布

npm包支持esmodule

使用babel来进行一些现代JavaScript的支持,

  1. 创建配置文件


    touch .babelrc
  2. 安装先关包
  3. 配置babel


    {
    "presets": [
    [
    "@babel/preset-env",
    {
    "targets": {
    "browsers": [
    "last 2 versions",
    "safari &gt;= 7"
    ],
    "chrome": 52,
    "node": "6.10.0"
    },
    "modules": "commonjs",
    "useBuiltIns": "usage"
    }
    ]
    ],
    "plugins": [
    "@babel/plugin-syntax-dynamic-import",
    "@babel/plugin-syntax-import-meta",
    "@babel/plugin-proposal-class-properties",
    "@babel/plugin-proposal-json-strings",
    [
    "@babel/plugin-proposal-decorators",
    {
    "legacy": true
    }
    ],
    "@babel/plugin-proposal-function-sent",
    "@babel/plugin-proposal-export-namespace-from",
    "@babel/plugin-proposal-numeric-separator",
    "@babel/plugin-proposal-throw-expressions",
    "@babel/plugin-proposal-export-default-from",
    "@babel/plugin-proposal-logical-assignment-operators",
    "@babel/plugin-proposal-optional-chaining",
    [
    "@babel/plugin-proposal-pipeline-operator",
    {
    "proposal": "minimal"
    }
    ],
    "@babel/plugin-proposal-nullish-coalescing-operator",
    "@babel/plugin-proposal-do-expressions"
    ]
    }
  4. 编译


    ./node_modules/.bin/babel src -d lib

最后的测试代码地址test-demo-npm

npm包的发布和管理的更多相关文章

  1. npm 包的 发布 流程

    npm 包的发布流程 本文主要是针对 还未曾发布过自己的 npm 的同学,阐述一下 npm 的发布流程 熟悉的同学,可以绕道了. 首先你得有一个 自己的 npmjs.com 的账号 (没有的话,就到 ...

  2. 如何开发一个npm包并发布

    一.安装nodejs 不多说了,网上教程多得是 二.创建自己的npm包 目录结构 npm-test a.js b.js package.json 开发 为了简单便于理解,就开发一个简单地hello程序 ...

  3. Github 持续化集成 工作流 Npm包自动化发布

    Github 持续化集成 工作流 Npm包自动化发布 简介   持续集成指的是,频繁地(一天多次)将代码集成到主干. 它的好处主要有两个: 快速发现错误.每完成一点更新,就集成到主干,可以快速发现错误 ...

  4. 如何开发一个npm包并发布到npm中央仓库

    转自: https://liaolongdong.com/2019/01/24/publish-public-npm.html 如何开发一个npm包并发布到npm中央仓库需求背景:平时在项目工作中可能 ...

  5. 关于npm 包的发布

    注册一个npm 账号,打开命令行输入 npm add user 然后登录 npm login 发布npm 包,在你要发布的包的目录下,在创建账号后需要认证邮箱,否则无法发布,发布同一个包,每次的版本需 ...

  6. npm包的发布

    假设该待发布包在你本地的项目为 project1 包的本地安装测试 在发布之前往往希望在本地进行安装测试.那么需要一个其他的项目来本地安装待发布项目. 假设该其他项目为project2.假设proje ...

  7. 从0开始用webpack开发antd,react组件库npm包并发布

    一.初始化一个npm包 1.新建一个文件夹(名称随意,建议和报名一致),输入命令 :npm init -y 会自动生成一个包的说明文件 package.json如下(本文以scroll-antd-ta ...

  8. npm包实现发布正式和测试版

    npm publish的時候 怎麽發測試版和正式版本呢? 通常我們一般情況下 直接 npm publish 提交自己的開發包后,在項目中 npm install @packageName 是下載下來剛 ...

  9. 创建并发布npm包

    1.npm官网创建npm账户 npm网站地址:https://www.npmjs.com/ npm网站注册地址:https://www.npmjs.com/signup 2.命令行工具登录npm np ...

随机推荐

  1. Vue路由模块化的实现方法

    分享一个Vue路由模块化方法,简单实用,好用到飞起 路由模块化 1.router/index.js 配置路由 import Vue from 'vue' import VueRouter from ' ...

  2. 使用jQuery设置和获取css样式

  3. 趣味vi:Do you love me?

    看到网上有很多这样的小趣味exe,自己用labview也做了一个,可能有很多bug,马马虎虎能用,大家可以发给自己滴那个人,哈哈哈.源码vi和exe文件都在链接中https://files.cnblo ...

  4. Database4.exe用来导入excel

    从ACCESS数据库导出的EXCEL表格,可以通过database4.exe来连接,并导出sql脚本,再用database4.exe来连接ACCESS并先创建于脚本结构一致的表,然后复制脚本,从新生成 ...

  5. Linux平台Zabbix Agent的安装配置

    这里简单总结一下Linux平台Zabbix Agent的安装配置,实验测试的Zabbix版本比较老了(Zabbix 3.0.9),不过版本虽然有点老旧,但是新旧版本的安装步骤.流程基本差别不大.这里的 ...

  6. JS数组去重的实现

    其实数组去重的实现就分为两大类 利用语法自身键不可重复性 利用循环(递归)和数组方法使用不同的api来处理. 注意️:下列封装成方法的要在函数开始增加类型检测,为了让去重的实现代码更加简单易懂,封装时 ...

  7. 莫名其妙的Explain Plan

    两张表的建表语句: CREATE TABLE hy_emp ( empno NUMBER(8,0) not null primary key, ename NVARCHAR2(60) not null ...

  8. Cassandra使用的各种策略

    1. 背景介绍 Cassandra 使用分布式哈希表(DHT)来确定存储某一个数据对象的节点.在 DHT 里面,负责存储的节点以及数据对象都被分配一个 token.token 只能在一定的范围内取值, ...

  9. ubuntu 18.04下修改python3指向

    起因 ubuntu18.04下默认带的是python3.6,但是因为需求需要升级为python3.7 步骤 安装 sudo apt install python3.7 修改环境变量 修改默认的pyth ...

  10. 你准备好开始DevOps了吗?

    前面一章节我们已经了解了Agile,CI/CD,DevOps,作为DevOps的起点,对于一个团队,如何开始自己的持续集成?根据我的经验,列出了一下需要考虑的点 1. 代码管理/分支策略 代码托管在哪 ...