ты действительно понимаешь package.json

JavaScript

предисловие

В Node.js модуль представляет собой библиотеку или рамку и проект Node.js. Проекты Node.js следуют модульной архитектуре. Когда мы создаем проект Node.js, это означает создание модуля. Файл описания этого модуля называется Package.json.

Я смотрел файл package.json в чужих проектах доscriptsПишите так:

"dev": "rimraf \"config/.conf.json\" && rimraf \"src/next.config.js\" && cpx \".conf.json\" \"config/\" && nodemon server/index.ts",
"clean": "rimraf ./dist && mkdir dist",
"prebuild": "npm run clean",
"build": "cross-env NODE_ENV=production webpack"

В то время я был немного в замешательстве, поэтому я дополнил соответствующие знания и обнаружил, что в package.json есть много мест, которые мы проигнорировали.Если есть друзья, которые немного запутались, как и я, эту статью нельзя пропустить. .

bin

Это карта имен команд и имен локальных файлов. При установке npm будет использовать символические ссылки, чтобы связать эти файлы с префиксом/bin, если он установлен глобально, или с ./node_modules/.bin/, если он установлен локально.

Популярное понимание состоит в том, что если мы установим его глобально, мы сможем выполнить этот файл в командной строке, а если мы установим его локально, мы сможем выполнить файл в командной строке в текущем каталоге проекта.

"bin": {
    "gynpm": "./bin/index.js"
}

Обратите внимание: заголовок этого файла index.js должен иметь это#!/usr/bin/env nodeузел, иначе скрипт запустится без исполняемого файла узла.

небольшой эксперимент

пройти черезnpm init -yСоздайте файл package.json.

{
    "name": "cc",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "bin": {
        "mason": "./index.js"
    },
    "scripts": {},
    "keywords": [],
    "author": "",
    "license": "ISC",
    "dependencies": {}
}

Создайте новый файл index.js в том же каталоге, что и package.json.

#!/usr/bin/env node

console.log('cool')

Затем выполните в каталоге проекта: под mac:sudo npm i -g, под окном:npm i -g

Затем вы открываете новую командную строку в любом каталоге и вводитеmason, вы говорите о видении

coolполе.

Я не знаю, поможет ли этот небольшой эксперимент вам лучше понять это.binэффект. как обычноvue-cli,create-react-appИ так далее, команды сопоставляются с глобальными через атрибут bin.

main

main очень важен, это главная точка входа в наш проект.

"main": "app.js"

Таким образом, наш проект будет использовать файл app.js в корневом каталоге в качестве входного файла нашего проекта.

scripts

npm позволяет определять команды сценариев с помощью поля scripts в файле package.json. преимущество: Скрипты, связанные с проектом, могут быть централизованы в одном месте.

不同项目的脚本命令,只要功能相同,就可以有同样的对外接口。用户不需要知道怎么测试你的项目,只要运行npm run test即可。

可以利用 npm 提供的很多辅助功能。

Обоснование скриптов npm очень простое. Всякий раз, когда выполняется npm run, автоматически создается новая оболочка, и указанная команда скрипта выполняется в этой оболочке. Следовательно, пока это команда, которую может запустить оболочка (обычно Bash), она может быть записана в скрипте npm.

Что особенного, так это то, что новая оболочка, созданная npm run, добавит подкаталог node_modules/.bin текущего каталога в переменную PATH.После завершения выполнения переменная PATH будет восстановлена ​​в исходное состояние.

Это означает, что все скрипты в подкаталоге node_modules/.bin текущего каталога могут вызываться напрямую с именем скрипта без добавления пути. Например, если в зависимостях текущего проекта есть Mocha, просто напишите mocha test напрямую.

* подстановочный знак

*представляет произвольное имя файла,**Представляет любой уровень подкаталогов.


"lint": "jshint *.js"
"lint": "jshint **/*.js"

Чтобы оболочка не экранировала подстановочные знаки, экранируйте звездочки, если вы хотите передать подстановочные знаки в исходную команду.

"test": "tap test/\*.js"

Символ параметра скрипта: --

"server": "webpack-dev-server --mode=development --open --iframe=true ",

Порядок выполнения скрипта

Параллельное выполнение (т.е. параллельное выполнение одновременно), вы можете использовать&символ

$ npm run script1.js & npm run script2.js

Вторичное выполнение (задача, которая является только первой успешной, выполняет только следующую задачу), вы можете использовать&&символ

$ npm run script1.js && npm run script2.js

крючок скрипта

В скрипте npm есть два хука, pre и post, в этих двух хуках можно делать некоторые приготовления и очистку.

eg:

"clean": "rimraf ./dist && mkdir dist",
"prebuild": "npm run clean",
"build": "cross-env NODE_ENV=production webpack"

npm по умолчанию предоставляет следующие хуки:

prepublish,postpublish
preinstall,postinstall
preuninstall,postuninstall
preversion,postversion
pretest,posttest
prestop,poststop
prestart,poststart
prerestart,postrestart

Получить переменные package.json

Очень мощная функция сценариев npm заключается в том, что они могут использовать внутренние переменные npm.

Во-первых, префикс npm_package_, скрипт npm может получить package.json внутри поля. Например, вот package.json.

// package.json
{
  "name": "foo", 
  "version": "1.2.5",
  "scripts": {
    "view": "node view.js"
  }
}

Мы можем сделать это в нашем собственном js:

console.log(process.env.npm_package_name); // foo
console.log(process.env.npm_package_version); // 1.2.5

Общие скрипты


// 删除目录
"clean": "rimraf dist/*",

// 本地搭建一个 HTTP 服务
"serve": "http-server -p 9090 dist/",

// 打开浏览器
"open:dev": "opener http://localhost:9090",

// 实时刷新
 "livereload": "live-reload --port 9091 dist/",

// 构建 HTML 文件
"build:html": "jade index.jade > dist/index.html",

// 只要 CSS 文件有变动,就重新执行构建
"watch:css": "watch 'npm run build:css' assets/styles/",

// 只要 HTML 文件有变动,就重新执行构建
"watch:html": "watch 'npm run build:html' assets/html",

// 部署到 Amazon S3
"deploy:prod": "s3-cli sync ./dist/ s3://example-com/prod-site/",

// 构建 favicon
"build:favicon": "node scripts/favicon.js",

Ввести несколько модулей, полезных в скриптах npm.

cpx глобальная копия

Хороший модуль для наблюдения за глобальными изменениями файлов и копирования их в нужный каталог.

Мы можем установить его с помощью npm и использовать в скриптах npm:

"copy": "cpx \".conf.json\" \"config/\" "

Итак, мы бежимnpm run copyв корневом каталоге.conf.jsonкопировать файл вconfigПод папкой, если папки config нет, будет создана новая.

cpx "src/**/*.{html,png,jpg}" app --watch

Когда любые файлы .html, .png, .jpg и другие файлы в каталоге src изменяются, они копируются в каталог приложения.

cross-env может устанавливать и использовать переменные среды на разных платформах

В большинстве случаев использование команды командной строки, подобной: NODE_ENV=production, приведет к зависанию на платформе Windows Существует много различий между платформой Windows и POSIX при использовании командной строки (например, в POSIX используйте $ENV_VAR, в Windows, используйте %ENV_VAR%...)

cross-env делает это легко, используя уникальные директивы для разных платформ, не беспокоясь о кросс-платформенных проблемах:

"start": "cross-env NODE_ENV=production node server/index.js",

зависимости и devDependencies

Эти два в основном места для хранения библиотек, от которых зависит наш проект.devDependencies в основном хранятся для локальной разработки, и зависимости будут подключены к сети, когда мы разрабатываем.

пройти черезnpm i xxx -Sбудет помещен в зависимости,npm i xxx -Dбудет помещен в devDependencies. Поэтому мы должны учитывать, можно ли использовать пакет онлайн, когда мы его упаковываем, и не ставить все это в зависимости, что увеличит объем и эффективность нашей упаковки.

peerDependencies

Мы видим это свойство в package.json некоторых проектов.В основном оно касается вопросов совместимости.Чтобы понять это простым способом, мы можем сказать людям, которые хотят использовать наш модуль через это свойство:

Если вы хотите использовать меня, вам лучше принести xxx1 и xxx2, или я могу доставить вам неприятности.

"peerDependencies": {
        "xxx1": "1.0.0",
        "xxx2": "1.0.0",
    }

Таким образом, при упаковке вы также принесете две сумки xxx1 и xxx2.

Лично для меня это самые важные. И некоторые, например:author, version, keywords, descriptionЭто легко понять.

Ссылаться на

npmjs

Блог Руан Ифэн