Explorando las nuevas características de npm 9

Cambios en config, timing, loglevel, login, addUser, query, pack, access, and install, junto con eliminaciones.

· 18 min de lectura
Explorando las nuevas características de npm 9

Npm es el gestor de paquetes para la plataforma JavaScript node.js. Coloca los módulos en su sitio (node_modules) para que el nodo pueda encontrarlos. También gestiona los conflictos de dependencia de forma inteligente.

Npm es configurable para soportar una variedad de casos de uso para publicar, descubrir, instalar y desarrollar programas node. Tiene una lista de poderosos comandos.

Npm 9 fue lanzado el 19 de octubre de 2022. El objetivo de esta versión principal era estandarizar los valores predeterminados apropiados y limpiar las configuraciones heredadas en la medida de lo posible.

Aquí está el comando para instalar npm 9:

% npm install -g npm@9

Después de la instalación, npm está en la versión 9.0.1.

% npm --version
9.0.1

Este es el manual de ayuda:

% npm --help
npm <command>

Usage:

npm install        install all the dependencies in your project
npm install <foo>  add the <foo> dependency to your project
npm test           run this project's tests
npm run <foo>      run the script named <foo>
npm <command> -h   quick help on <command>
npm -l             display usage info for all commands
npm help <term>    search for help on <term>
npm help npm       more involved overview

All commands:

    access, adduser, audit, bugs, cache, ci, completion,
    config, dedupe, deprecate, diff, dist-tag, docs, doctor,
    edit, exec, explain, explore, find-dupes, fund, get, help,
    hook, init, install, install-ci-test, install-test, link,
    ll, login, logout, ls, org, outdated, owner, pack, ping,
    pkg, prefix, profile, prune, publish, query, rebuild, repo,
    restart, root, run-script, search, set, shrinkwrap, star,
    stars, start, stop, team, test, token, uninstall, unpublish,
    unstar, update, version, view, whoami

Specify configs in the ini-formatted file:
    /Users/jenniferfu/.npmrc
or on the command line via: npm <command> --key=value

More configuration info: npm help config
Configuration fields: npm help 7 config

npm@9.0.1 /Users/jenniferfu/.nvm/versions/node/v19.0.0/lib/node_modules/npm

La actualización de npm 9 puede realizarse para cualquier versión de node soportada, ^14.17.0 || ^16.13.0 || >=18.0.0.

nvm es una forma sencilla de gestionar las versiones de node y npm. Exploramos las características de npm 9 en el entorno de trabajo de node.js 19.

% node --version
v19.0.0
% npm --version
9.0.1

Estas son las nuevas características de npm 9:

  • Cambios en la configuración
  • Cambios en timing y loglevel
  • Cambios en npm login y npm addUser
  • Cambios en npm query
  • Cambios en npm pack
  • Cambios en npm access
  • Cambios en npm install
  • Eliminación de npm birthday, npm set-script y npm bin

Cambios en la configuración de npm

npm config gestiona los archivos de configuración de npm. Soporta los siguientes usos:

npm config set <key>=<value> [<key>=<value> ...]
npm config get [<key> [<key> ...]]
npm config delete <key> [<key> ...]
npm config list [--json]
npm config edit
npm config fix

npm config fix es un nuevo comando que valida la configuración y corrige los problemas.

Aquí está el código fuente:

async fix () {
  let problems

  try {
    this.npm.config.validate()
    return // if validate doesn't throw we have nothing to do
  } catch (err) {
    // coverage skipped because we don't need to test rethrowing errors
    // istanbul ignore next
    if (err.code !== 'ERR_INVALID_AUTH') {
      throw err
    }

    problems = err.problems
  }

  if (!this.npm.config.isDefault('location')) {
    problems = problems.filter((problem) => {
      return problem.where === this.npm.config.get('location')
    })
  }

  this.npm.config.repair(problems)
  const locations = []

  this.npm.output('The following configuration problems have been repaired:\n')
  const summary = problems.map(({ action, from, to, key, where }) => {
    // coverage disabled for else branch because it is intentionally omitted
    // istanbul ignore else
    if (action === 'rename') {
      // we keep track of which configs were modified here so we know what to save later
      locations.push(where)
      return `~ \`${from}\` renamed to \`${to}\` in ${where} config`
    } else if (action === 'delete') {
      locations.push(where)
      return `- \`${key}\` deleted from ${where} config`
    }
  }).join('\n')
  this.npm.output(summary)

  return await Promise.all(locations.map((location) => this.npm.config.save(location)))
}

Nos encontramos con un error al utilizar npm 9:

% npm run build
npm ERR! code ERR_INVALID_AUTH
npm ERR! Invalid auth configuration found: `_auth` must be renamed to `//mycompany.jfrog.io/mycompany/api/npm/mycompany-components-registry/:_auth` in project config
npm ERR! Please run `npm config fix` to repair your configuration.`
npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/jenniferfu/.npm/_logs/2022-11-03T17_11_47_188Z-debug-0.log

Ejecutando npm config fix se ha resuelto el problema:

% npm config fix
The following configuration problems have been repaired:
~ `_auth` renamed to `//mycompany.jfrog.io/mycompany/api/npm/mycompany-components-registry/:_auth` in project config
view rawnpm9.config.fix.console hosted with ❤ by GitHub

Para el error de compilación, npm emite algunos errores JSON en stdout. Anteriormente, npm enviaba todos los errores con formato JSON a stderr, lo que dificultaba su análisis, ya que el flujo de stderr suele tener registros ya escritos. npm 9 lo ha mejorado. 🎉

Además, npm config set ya no acepta opciones de configuración obsoletas o inválidas. npm 9 config ha eliminado node-version y npm-version , y ha hecho que install-links sea por defecto true.

Cambios en la sincronización y el nivel de registro


Todos los comandos de npm pueden tener una opción, --timing. Cuando el indicador está activado, npm escribe los datos de sincronización en un archivo junto con los datos de registro de depuración. La ubicación del registro se establece mediante la opción logs-dir y recae en /_logs.

Así es como se ejecuta npm --timing:

% npm --timing
npm timing npm:load:whichnode Completed in 0ms
npm timing config:load:defaults Completed in 1ms
npm timing config:load:file:/Users/jenniferfu/.nvm/versions/node/v19.0.0/lib/node_modules/npm/npmrc Completed in 1ms
npm timing config:load:builtin Completed in 1ms
npm timing config:load:cli Completed in 2ms
npm timing config:load:env Completed in 0ms
npm timing config:load:project Completed in 0ms
npm timing config:load:file:/Users/jenniferfu/.npmrc Completed in 0ms
npm timing config:load:user Completed in 0ms
npm timing config:load:file:/Users/jenniferfu/.nvm/versions/node/v19.0.0/etc/npmrc Completed in 0ms
npm timing config:load:global Completed in 0ms
npm timing config:load:setEnvs Completed in 1ms
npm timing config:load Completed in 6ms
npm timing npm:load:configload Completed in 6ms
npm timing npm:load:mkdirpcache Completed in 0ms
npm timing npm:load:mkdirplogs Completed in 0ms
npm timing npm:load:setTitle Completed in 16ms
npm timing config:load:flatten Completed in 3ms
npm timing npm:load:display Completed in 5ms
npm timing npm:load:logFile Completed in 4ms
npm timing npm:load:timers Completed in 1ms
npm timing npm:load:configScope Completed in 0ms
npm timing npm:load Completed in 32ms
npm <command>

Usage:

npm install        install all the dependencies in your project
npm install <foo>  add the <foo> dependency to your project
npm test           run this project's tests
npm run <foo>      run the script named <foo>
npm <command> -h   quick help on <command>
npm -l             display usage info for all commands
npm help <term>    search for help on <term>
npm help npm       more involved overview

All commands:

    access, adduser, audit, bugs, cache, ci, completion,
    config, dedupe, deprecate, diff, dist-tag, docs, doctor,
    edit, exec, explain, explore, find-dupes, fund, get, help,
    hook, init, install, install-ci-test, install-test, link,
    ll, login, logout, ls, org, outdated, owner, pack, ping,
    pkg, prefix, profile, prune, publish, query, rebuild, repo,
    restart, root, run-script, search, set, shrinkwrap, star,
    stars, start, stop, team, test, token, uninstall, unpublish,
    unstar, update, version, view, whoami

Specify configs in the ini-formatted file:
    /Users/jenniferfu/.npmrc
or on the command line via: npm <command> --key=value

More configuration info: npm help config
Configuration fields: npm help 7 config

npm@9.0.1 /Users/jenniferfu/.nvm/versions/node/v19.0.0/lib/node_modules/npm
npm timing npm Completed in 37ms

Después de cada ejecución de un comando de temporización, se genera un nuevo archivo de temporización en /_logs/, como, 2022-11-01T02_31_07_194Z-timing.json.

El archivo de sincronización se denomina -timing.json, donde  es una marca de tiempo. Este método de nombramiento es similar al de los registros de depuración.

% pwd
/Users/jenniferfu/.npm/_logs
% ls -l
total 104
-rw-r--r--  1 jenniferfu  staff  1633 Oct 30 10:20 2022-10-30T17_20_17_679Z-debug-0.log
-rw-r--r--  1 jenniferfu  staff  1923 Oct 30 18:32 2022-10-31T01_32_04_260Z-debug-0.log
-rw-r--r--  1 jenniferfu  staff  1879 Oct 30 18:32 2022-10-31T01_32_42_633Z-debug-0.log
-rw-r--r--  1 jenniferfu  staff  3894 Oct 30 18:37 2022-10-31T01_37_55_929Z-debug-0.log
-rw-r--r--  1 jenniferfu  staff  2126 Oct 30 18:38 2022-10-31T01_38_07_355Z-debug-0.log
-rw-r--r--  1 jenniferfu  staff  1879 Oct 31 19:31 2022-11-01T02_31_07_194Z-debug-0.log
-rw-r--r--  1 jenniferfu  staff   867 Oct 31 19:31 2022-11-01T02_31_07_194Z-timing.json

Aquí están los datos JSON en 2022-11-01T02_31_07_194Z-timing.json :

% cat 2022-11-01T02_31_07_194Z-timing.json | npm exec -- json -g
[
  {
    "metadata": {
      "id": "2022-11-01T02_31_07_194Z",
      "command": [
        "--timing"
      ],
      "logfiles": [
        "/Users/jenniferfu/.npm/_logs/2022-11-01T02_31_07_194Z-debug-0.log"
      ],
      "version": "9.0.1"
    },
    "timers": {
      "npm:load:whichnode": 0,
      "config:load:defaults": 1,
      "config:load:file:/Users/jenniferfu/.nvm/versions/node/v19.0.0/lib/node_modules/npm/npmrc": 1,
      "config:load:builtin": 1,
      "config:load:cli": 1,
      "config:load:env": 1,
      "config:load:project": 0,
      "config:load:file:/Users/jenniferfu/.npmrc": 0,
      "config:load:user": 1,
      "config:load:file:/Users/jenniferfu/.nvm/versions/node/v19.0.0/etc/npmrc": 0,
      "config:load:global": 0,
      "config:load:setEnvs": 1,
      "config:load": 7,
      "npm:load:configload": 7,
      "npm:load:mkdirpcache": 0,
      "npm:load:mkdirplogs": 0,
      "npm:load:setTitle": 16,
      "config:load:flatten": 2,
      "npm:load:display": 5,
      "npm:load:logFile": 4,
      "npm:load:timers": 0,
      "npm:load:configScope": 1,
      "npm:load": 34,
      "npm": 39
    },
    "unfinishedTimers": {}
  }
]

Los datos JSON tienen tres claves de nivel superior, metadatos (línea 4), temporizadores (línea 14) y unfinishedTimers (línea 40).

A partir de npm 9, se ha eliminado timing como valor para --loglevel. --timing mostrará la información de temporización independientemente de --loglevel, excepto cuando sea --silent.

Aquí está el comando timing con --loglevel info:

% npm run build --timing --loglevel info
npm info using npm@9.0.1
npm info using node@v19.0.0
npm timing npm:load:whichnode Completed in 0ms
npm timing config:load:defaults Completed in 2ms
npm timing config:load:file:/Users/jenniferfu/.nvm/versions/node/v19.0.0/lib/node_modules/npm/npmrc Completed in 0ms
npm timing config:load:builtin Completed in 0ms
npm timing config:load:cli Completed in 2ms
npm timing config:load:env Completed in 1ms
npm timing config:load:file:/Users/jenniferfu/funStuff/my-app/.npmrc Completed in 0ms
npm timing config:load:project Completed in 3ms
npm timing config:load:file:/Users/jenniferfu/.npmrc Completed in 0ms
npm timing config:load:user Completed in 1ms
npm timing config:load:file:/Users/jenniferfu/.nvm/versions/node/v19.0.0/etc/npmrc Completed in 0ms
npm timing config:load:global Completed in 0ms
npm timing config:load:setEnvs Completed in 1ms
npm timing config:load Completed in 10ms
npm timing npm:load:configload Completed in 10ms
npm timing npm:load:mkdirpcache Completed in 0ms
npm timing npm:load:mkdirplogs Completed in 0ms
npm timing npm:load:setTitle Completed in 16ms
npm timing config:load:flatten Completed in 2ms
npm timing npm:load:display Completed in 5ms
npm timing npm:load:logFile Completed in 7ms
npm timing npm:load:timers Completed in 0ms
npm timing npm:load:configScope Completed in 0ms
npm timing npm:load Completed in 39ms

> my-app@0.1.0 build
> react-scripts build

Creating an optimized production build...
Compiled successfully.

File sizes after gzip:

  46.6 kB  build/static/js/main.0215976b.js
  1.78 kB  build/static/js/787.28cb0dcd.chunk.js
  541 B    build/static/css/main.073c9b0a.css

The project was built assuming it is hosted at /.
You can control this with the homepage field in your package.json.

The build folder is ready to be deployed.
You may serve it with a static server:

  yarn global add serve
  serve -s build

Find out more about deployment here:

  https://cra.link/deployment

npm timing command:run Completed in 9577ms
npm timing npm Completed in 9637ms
npm info ok

npm info Timing info written to:
npm info     /Users/jenniferfu/.npm/_logs/2022-11-05T04_49_06_665Z-timing.json
npm info A complete log of this run can be found in:
npm info     /Users/jenniferfu/.npm/_logs/2022-11-05T04_49_06_665Z-debug-0.log

El archivo de sincronización aparece en la línea 59.
El archivo de depuración aparece en la línea 61.


Aquí está el comando de sincronización con --loglevel silent:

% npm run build --timing --loglevel silent
Creating an optimized production build...
Compiled successfully.

File sizes after gzip:

  46.6 kB  build/static/js/main.0215976b.js
  1.78 kB  build/static/js/787.28cb0dcd.chunk.js
  541 B    build/static/css/main.073c9b0a.css

The project was built assuming it is hosted at /.
You can control this with the homepage field in your package.json.

The build folder is ready to be deployed.
You may serve it with a static server:

  yarn global add serve
  serve -s build

Find out more about deployment here:

  https://cra.link/deployment

Independientemente de la configuración de --loglevel, el archivo de tiempo y el archivo de registro se generan en /_logs/.

Cambios en npm login y npm addUse


Antes de npm 9, había un comando npm addUser, que tenía dos alias, login y add-user.

En npm 9, npm login es un comando separado, que verifica un usuario en el registro especificado, y guarda las credenciales en el archivo .npmrc. Si no se especifica ningún registro, se utilizará el registro por defecto.

Así es como se ejecuta npm login:


% npm login
npm notice Log in on https://registry.npmjs.org/
Login at:
https://www.npmjs.com/login?next=/login/cli/e6283697-ef62-4962-8429-12f18f7eebc8
Press ENTER to open in the browser...

Pulsa ENTER y se abrirá una ventana de acceso en el navegador:

En npm 9, npm addUser tiene un alias, add-user. Crea un nuevo usuario en el registro especificado y guarda las credenciales en el archivo .npmrc. Si no se especifica ningún registro, se utilizará el registro por defecto.

Así es como se ejecuta npm addUser:


% npm addUser
npm notice Log in on https://registry.npmjs.org/
Create your account at:
https://www.npmjs.com/login?next=/login/cli/e8f93881-9877-4558-b575-10b09f1491b1
Press ENTER to open in the browser...

Pulse ENTER y se abrirá una ventana de acceso en el navegador:

Tanto para npm login como para npm addUser, sólo se admiten dos valores:

auth-type web: Es el valor por defecto.
legacy: Cuando se utiliza legacy, el nombre de usuario y la contraseña se leen desde los avisos.

% npm login --auth-type=legacy
npm notice Log in on https://registry.npmjs.org/
Username: testUser
Password:

Estos valores auth-type han sido eliminados en npm 9: sso, saml, oauth y webauthn

web y legacy sólo prueban sus respectivos métodos, es decir, npm ya no los prueba todos y espera a ver cuál no falla.

Para npm login y npm addUser, las ventanas de login en el navegador tienen el mismo aspecto. Sin embargo, tienen algunas diferencias dependiendo del auth-type:

web: La petición POST a /-/v1/ login contiene un valor { create: true } en su carga útil para adduser.
legacy: La petición PUT a /-/user/org.couchdb.user:${username}
contiene un valor de correo electrónico en su carga útil para adduser.

Cambios en npm query


npm query recupera una lista filtrada de paquetes. Utiliza selectores CSS para realizar el filtrado, aunque no hay selectores de etiquetas, como div, h1 y a. El objetivo de la consulta son los objetos de dependencia.

Estos son los selectores soportados:

* selector universal

#<name> Selector de dependencia equivalente a [name="..."]

#<name>@<version> equivalente a [name=<name>]:semver(<version>))

, delimitador de la lista de selectores.

. selector de tipo de dependencia.

: Pseudo-selector

Configuramos el Create React App, que incluye el package.json

% npx create-react-app my-app
% cd my-app

Consultar el paquete react:

% npm query "#react"
[
  {
    "name": "react",
    "description": "React is a JavaScript library for building user interfaces.",
    "keywords": [
      "react"
    ],
    "version": "18.2.0",
    "homepage": "https://reactjs.org/",
    "bugs": "https://github.com/facebook/react/issues",
    "license": "MIT",
    "files": [
      "LICENSE",
      "README.md",
      "index.js",
      "cjs/",
      "umd/",
      "jsx-runtime.js",
      "jsx-dev-runtime.js",
      "react.shared-subset.js"
    ],
    "main": "index.js",
    "exports": {
      ".": {
        "react-server": "./react.shared-subset.js",
        "default": "./index.js"
      },
      "./package.json": "./package.json",
      "./jsx-runtime": "./jsx-runtime.js",
      "./jsx-dev-runtime": "./jsx-dev-runtime.js"
    },
    "repository": {
      "type": "git",
      "url": "https://github.com/facebook/react.git",
      "directory": "packages/react"
    },
    "engines": {
      "node": ">=0.10.0"
    },
    "dependencies": {
      "loose-envify": "^1.1.0"
    },
    "browserify": {
      "transform": [
        "loose-envify"
      ]
    },
    "_id": "react@18.2.0",
    "pkgid": "react@18.2.0",
    "location": "node_modules/react",
    "path": "/Users/jenniferfu/funStuff/my-app/node_modules/react",
    "realpath": "/Users/jenniferfu/funStuff/my-app/node_modules/react",
    "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
    "from": [
      "",
      "node_modules/react-dom",
      "node_modules/react-scripts",
      "node_modules/@testing-library/react"
    ],
    "to": [
      "node_modules/loose-envify"
    ],
    "dev": false,
    "inBundle": false,
    "deduped": false,
    "overridden": false,
    "queryContext": {}
  }
]

El resultado de la consulta muestra los detalles del paquete react. En la línea 68, queryContext es {}, una nueva propiedad en npm 9.

La propiedad queryContext puede incluir versiones, outdated.outOfRange y outdated.outOfRange. Veamos tres ejemplos.

Ejemplo 1: La propiedad queryContext` incluye versiones, un array de todas las versiones disponibles del nodo dado.

:outdated() es un pseudo-selector para mostrar las dependencias obsoletas. :outdated > #react muestra los paquetes React desactualizados.

Desde las líneas 69-111 del código de abajo, muestra una larga lista de paquetes React desactualizados.

% npm query ":outdated > #react"
[
  {
    "name": "react",
    "description": "React is a JavaScript library for building user interfaces.",
    "keywords": [
      "react"
    ],
    "version": "18.2.0",
    "homepage": "https://reactjs.org/",
    "bugs": "https://github.com/facebook/react/issues",
    "license": "MIT",
    "files": [
      "LICENSE",
      "README.md",
      "index.js",
      "cjs/",
      "umd/",
      "jsx-runtime.js",
      "jsx-dev-runtime.js",
      "react.shared-subset.js"
    ],
    "main": "index.js",
    "exports": {
      ".": {
        "react-server": "./react.shared-subset.js",
        "default": "./index.js"
      },
      "./package.json": "./package.json",
      "./jsx-runtime": "./jsx-runtime.js",
      "./jsx-dev-runtime": "./jsx-dev-runtime.js"
    },
    "repository": {
      "type": "git",
      "url": "https://github.com/facebook/react.git",
      "directory": "packages/react"
    },
    "engines": {
      "node": ">=0.10.0"
    },
    "dependencies": {
      "loose-envify": "^1.1.0"
    },
    "browserify": {
      "transform": [
        "loose-envify"
      ]
    },
    "_id": "react@18.2.0",
    "pkgid": "react@18.2.0",
    "location": "node_modules/react",
    "path": "/Users/jenniferfu/funStuff/my-app/node_modules/react",
    "realpath": "/Users/jenniferfu/funStuff/my-app/node_modules/react",
    "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
    "from": [
      "",
      "node_modules/react-dom",
      "node_modules/react-scripts",
      "node_modules/@testing-library/react"
    ],
    "to": [
      "node_modules/loose-envify"
    ],
    "dev": false,
    "inBundle": false,
    "deduped": false,
    "overridden": false,
    "queryContext": {
      "versions": [
        "0.0.0-375616788",
        "0.0.0-00d4f95c2",
        ...
        "16.8.0",
        "16.8.1",
        "16.8.2",
        "16.8.3",
        "16.8.4",
        "16.8.5",
        "16.8.6",
        "16.9.0-alpha.0",
        "16.9.0-rc.0",
        "16.9.0",
        "16.10.0",
        "16.10.1",
        "16.10.2",
        "16.11.0",
        "16.12.0",
        "16.13.0",
        "16.13.1",
        "16.14.0",
        "17.0.0-rc.0",
        "17.0.0-rc.1",
        "17.0.0-rc.2",
        "17.0.0-rc.3",
        "17.0.0",
        "17.0.1",
        "17.0.2",
        "18.0.0-alpha-00ced1e2b-20211102",
        "18.0.0-alpha-01be61c12",
        "18.0.0-alpha-02f411578-20211019",
        "18.0.0-alpha-031abd24b-20210907",
        "18.0.0-alpha-05726d72c-20210927",
        "18.0.0-alpha-0883c4cd3-20210929",
        "18.0.0-alpha-1314299c7-20210901",
        "18.0.0-alpha-13455d26d-20211104",
        "18.0.0-alpha-19092ac8c-20210803",
        "18.0.0-alpha-1a106bdc2",
        "18.0.0-alpha-1a3f1afbd",
        ...
        "18.3.0-next-fecc288b7-20221025"
      ]
    }
  }
]

Ejemplo 2: La propiedad queryContext incluye outdated.inRange, un array de objetos, cada uno con un from y versions.

from es la ubicación en disco del nodo que depende del nodo actual, y versions es una matriz de todas las versiones disponibles que satisfacen esa dependencia.

.prod:outdated(in-range) devuelve las dependencias de producción con una nueva versión que satisface al menos uno de sus bordes en el rango.

Ejecuta la consulta npm ".prod:outdated(in-range)", y podemos ver la propiedad outdated en un queryContext, con un from (línea 4) y versions (líneas 5-9).

"outdated": {
  "inRange": [
    {
      "from": "node_modules/@pmmmwh/react-refresh-webpack-plugin",
      "versions": [
        "0.12.0",
        "0.13.0",
        "0.14.0"
      ]
    }
  ]
}

Ejemplo 3: La propiedad queryContext incluye outdated.outOfRange, un array de objetos, cada uno con un from y versions.

from es la ubicación en disco del nodo que depende del nodo actual y versions es una matriz de todas las versiones disponibles que no satisfacen la dependencia.

.prod:outdated(out-of-range) devuelve las dependencias de producción que no satisfacen la dependencia.

Ejecuta la consulta npm ".prod:outdated(out-of-range)", y podemos ver la propiedad outOfRange en un queryContext, con un from (línea 4) y versions (líneas 5-10).

Cambios en npm pack


npm pack crea un tarball de un paquete. Dentro del entorno de trabajo de Create React App, ejecuta npm pack. Genera el tarball, my-app-0.1.0.tgz, en el directorio.

% npm pack
npm notice
npm notice 📦  my-app@0.1.0
npm notice === Tarball Contents ===
npm notice 3.4kB README.md
npm notice 809B  package.json
npm notice 3.9kB public/favicon.ico
npm notice 1.7kB public/index.html
npm notice 5.3kB public/logo192.png
npm notice 9.7kB public/logo512.png
npm notice 492B  public/manifest.json
npm notice 67B   public/robots.txt
npm notice 564B  src/App.css
npm notice 528B  src/App.js
npm notice 246B  src/App.test.js
npm notice 366B  src/index.css
npm notice 535B  src/index.js
npm notice 2.6kB src/logo.svg
npm notice 362B  src/reportWebVitals.js
npm notice 241B  src/setupTests.js
npm notice === Tarball Details ===
npm notice name:          my-app
npm notice version:       0.1.0
npm notice filename:      my-app-0.1.0.tgz
npm notice package size:  25.0 kB
npm notice unpacked size: 30.8 kB
npm notice shasum:        56364d3666525f27f5c482160e6194f90c8d9afb
npm notice integrity:     sha512-CVPXwX2zoa7+t[...]ea8pw+e6EIWug==
npm notice total files:   16
npm notice
my-app-0.1.0.tgz

% ls -l my-app-0.1.0.tgz
-rw-r--r--  1 jenniferfu  staff  24953 Nov  3 22:29 my-app-0.1.0.tgz

A partir de npm 9, npm pack sigue un estricto orden de operaciones al aplicar las reglas de ignorar. Si una matriz de archivos está presente en el package.json, las reglas en los archivos .gitignore y .npmignore de la raíz serán ignoradas.

Cambios en npm access


npm access establece el nivel de acceso en los paquetes publicados. Este es el uso del comando en npm 8:

npm access public [<package>]
npm access restricted [<package>]
npm access grant <read-only|read-write> <scope:team> [<package>]
npm access revoke <scope:team> [<package>]
npm access 2fa-required [<package>]
npm access 2fa-not-required [<package>]
npm access ls-packages [<user>|<scope>|<scope:team>]
npm access ls-collaborators [<package> [<user>]]
npm access edit [<package>]

Para todos los subcomandos, npm access realizará acciones sobre los paquetes en el directorio de trabajo actual si no se pasa ningún nombre de paquete al subcomando.

public / restricted (obsoleto): Establece que un paquete sea de acceso público o restringido.

grant / revoke (obsoleto): Añade o elimina la capacidad de los usuarios y equipos de tener acceso de sólo lectura o de lectura-escritura a un paquete.

2fa-required / 2fa-not-required  Configura si un paquete requiere que cualquier persona que lo publique tenga activada la autenticación de dos factores en su cuenta.

ls-packages Muestra todos los paquetes a los que puede acceder un usuario o un equipo, junto con el nivel de acceso, excepto los paquetes públicos de sólo lectura. No imprimirá el listado completo del registro.

ls-collaborators Muestra todos los privilegios de acceso de un paquete. Sólo mostrará los permisos de los paquetes a los que tenga al menos acceso de lectura.

Si se pasa <user> , la lista se filtra sólo a los equipos a los que pertenece el usuario.

edit No implementado

Los subcomandos de acceso a npm han sido renombrados. Este es el uso del comando en npm 9:

npm access list packages [<user>|<scope>|<scope:team> [<package>]
npm access list collaborators [<package> [<user>]]
npm access get status [<package>]
npm access set status=public|private [<package>]
npm access set mfa=none|publish|automation [<package>]
npm access grant <read-only|read-write> <scope:team> [<package>]
npm access revoke <scope:team> [<package>]

Aunque npm 9 cambió el nombre de los subcomandos, la funcionalidad sigue siendo la misma.

Cambios en npm install


El comando npm install instala un paquete y cualquier paquete del que dependa. install-strategy es una nueva bandera que tiene los siguientes tipos

hoisted: Instala sin duplicar en el nivel superior y duplica según sea necesario dentro de la estructura de directorios. Es el valor por defecto.

npm install —-install-strategy=hoisted is the same as npm install.

nested: Se instala en el lugar. No hay que levantar nada.

npm install --install-strategy=nested is the same as npm install --legacy-bundling. legacy-bundling has been deprecated in favor of  —-install-strategy=nested.

shallow: Sólo instala las dependencias directas en el nivel superior.

npm install --install-strategy=shallow is the same as npm install --global-style. global-style has been deprecated in favor of  --install-strategy=shallow.

Muchos parámetros de configuración tienen algún efecto sobre la instalación, y install-links es una de las opciones. Cuando se establece en true, las dependencias del protocolo se empaquetarán e instalarán como dependencias normales en lugar de crear un enlace simbólico. El valor por defecto era false en npm 8 y ha sido cambiado a true en npm 9.

Eliminación de npm birthday, npm set-script y npm bin


npm birthday es un huevo de pascua. Dice cuántos milisegundos faltan para el cumpleaños de npmcli o imprime un montón de emojis de globos y el hash de la primera confirmación de este repositorio. Fue eliminado y separado en su propio paquete hace algún tiempo.

npm set-script crea una tarea en la sección de scripts del package.json.

npm bin imprime la carpeta donde npm instalará los ejecutables.

Estos son comandos válidos en npm 8:

% npm birthday
npm WARN birthday birthday is deprecated and will be removed in a future release
npm ERR! Please try again in 28265164161ms

% npm set-script start "http-server ."
npm WARN set-script set-script is deprecated, use `npm pkg set scripts.scriptname="cmd" instead.

% npm bin
/Users/jenniferfu/node_modules/.bin

Sin embargo, estos comandos se han eliminado en npm 9:

 % npm birthday
Unknown command: "birthday"

To see a list of supported npm commands, run:
  npm help

% npm set-script start "http-server ."
Unknown command: "set-script"

Did you mean this?
    npm run-script # Run arbitrary package scripts

To see a list of supported npm commands, run:
  npm help

% npm bin
Unknown command: "bin"

To see a list of supported npm commands, run:
  npm help

Conclusión


npm 9 ha sido liberado. Soporta las versiones de node ^14.17.0 || ^16.13.0 || >=18.0.0.

npm 9 cambió config, timing, loglevel, login, addUser, query, pack, access, e install. También eliminó npm birthday, npm set-script y npm bin.

Plataforma de cursos gratis sobre programación

Fuente