Предисловие 🤔
- В корневом каталоге каждого проекта обычно находится
package.jsonФайл, который определяет различные зависимости и информацию о конфигурации проекта (например, имя, версию, лицензию и т. д. метаданные), необходимые для запуска проекта. - большинство людей правы
package.jsonПонимание файла остается только на:- Определение имени проекта, версии сборки проекта, лицензии;
- Определения зависимостей (включая
dependenciesполе,devDependenciesполе); - использовать
scriptsполе указываетnpmАббревиатура командной строки.
- фактически,
package.jsonРоль гораздо больше.Мы можем добиться более мощных функций, добавляя новые элементы конфигурации.Следующее приведет вас к новому пониманию.package.json.
От простого к сложному, обогащайте package.json проекта
Простая версия Package.json
- Когда мы создаем новое имя как
my-testпредметы, использоватьyarn init -yилиnpm init -yПосле команды в каталог проекта добавится новыйpackage.jsonфайл со следующим содержимым:
{
"name": "my-test", # 项目名称
"version": "1.0.0", # 项目版本(格式:大版本.次要版本.小版本)
"description": "", # 项目描述
"main": "index.js", # 入口文件
"scripts": { # 指定运行脚本命令的 npm 命令行缩写
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [], # 关键词
"author": "", # 作者
"license": "ISC" # 许可证
}
- можно увидеть,
package.jsonСодержание файла являетсяJSONОбъект, каждый член объекта является конфигурацией текущего проекта.
Обязательные атрибуты (имя и версия)
-
package.jsonЕсть много элементов конфигурации, и два поля, которые необходимо заполнить, этоnameполя иversionполя, они состоят изnpmУникальный идентификатор модуля.
поле имени
-
nameПоле определяет имя модуля, и его наименование должно соответствовать некоторым официальным спецификациям и рекомендациям:- Имя модуля станет модулем
url, аргумент в командной строке или имя папки, любое неurlБезопасные символы не допускаются в именах модулей (мы можем использоватьvalidate-npm-package-namepackage, чтобы определить, допустимо ли имя модуля); - Имена семантических модулей могут помочь разработчикам найти необходимые модули быстрее и избегайте случайного приобретения неправильного модуля;
- Если в имени модуля есть некоторые символы, символы не должны повторяться с существующим именем модуля после удаления их, например: поскольку
react-router-domуже существует,react.router.dom,reactrouterdomбольше не может быть создан.
- Имя модуля станет модулем
-
nameПоля не могут дублироваться с другими именами модулей, мы можем выполнить следующую команду, чтобы увидеть, использовалось ли уже имя модуля:
npm view <packageName>
- Если модуль существует, вы можете просмотреть некоторую основную информацию о модуле:
- Если имя модуля никогда не использовалось, будет выдана ошибка 404:
- Или мы также можем пойти
npmВведите имя модуля выше, если вы не можете его найти, вы можете использовать имя модуля.
поле версии
-
npmВсе версии модулей в пакете должны следоватьSemVerспецификации, номер стандартной версии этой спецификации принимаетX.Y.Zформат, гдеX,Yа такжеZВсе неотрицательные целые числа, и заполнение нулями перед числами запрещено:-
Xномер основной версии (major): модифицированный несовместимый API -
YЭтот номер версии (дополнительный): добавлена обратная совместимость. -
ZДля номера ревизии (патча): исправлена проблема обратной совместимости
-
- Если версия содержит серьезные изменения, нестабильна и может не соответствовать ожидаемым требованиям совместимости, мы можем сначала выпустить предварительную версию.
- Упреждающий номер версии может быть добавлен к
主版本号.次版本号.修订号позади, через-Номер объединяет последовательность идентификаторов, разделенных точками, и информацию о сборке версии:- Внутренняя версия (альфа)
- Публичная бета-версия (beta)
- Версия-кандидат rc официальной версии (т.е. Кандидат на выпуск)
- Мы можем проверить версию модуля, выполнив следующую команду:
npm view <packageName> version # 查看某个模块的最新版本
npm view <packageName> versions # 查看某个模块的所有历史版本
-
Проверить
antdПоследняя версия: -
Проверить
antdВсе исторические версии: -
можно увидеть,
antdстрого в соответствии сSemVerВерсия выпущена в соответствии со спецификацией, а номер версии строго в соответствии с主版本号.次版本号.修订号Формат именуется и строго инкрементируется, когда выпущенная версия сильно изменится, она будет выпущена первой.alpha,beta,rcДождитесь первой версии.
описание и ключевые слова
-
descriptionПоле используется для добавления информации описания модуля, чтобы пользователь мог понять модуль. -
keywordsПоля используются для добавления ключевых слов в модули. - когда мы используем
npmПри извлечении модуля модуль будетdescriptionполя иkeywordsполе для соответствия, напишитеpackage.jsonсерединаdescriptionа такжеkeywordsБудет полезно увеличить экспозицию наших модулей.
Установите зависимости проекта (зависимости и devDependencies)
-
dependenciesВ этом поле указывается модуль (используемый в производственной среде), от которого зависит запуск проекта, напримерantd,react,momentДругие библиотеки плагинов:- Это зависимости, которые нужны нашей производственной среде при использовании проекта в качестве
npmКогда пакет установлен, пользователь устанавливаетnpmпакет будет установлен толькоdependenciesзависимости внутри.
- Это зависимости, которые нужны нашей производственной среде при использовании проекта в качестве
-
devDependenciesВ этом поле указываются модули, необходимые для разработки проекта (используемые средой разработки), такие какwebpack,typescript,babelЖдать:- Нам не нужны эти инструменты, когда код упакован и отправлен на линию, поэтому мы помещаем его в
devDependenciesсередина.
- Нам не нужны эти инструменты, когда код упакован и отправлен на линию, поэтому мы помещаем его в
- Если модуль не
package.jsonфайл, мы можем установить этот модуль отдельно и использовать соответствующие параметры для его записиdependenciesполе/devDependenciesВ поле:
# 使用 npm
npm install <package...> --save # 写入 dependencies 属性
npm install <package...> --save-dev # 写入 devDependencies 属性
# 使用 yarn
yarn add <package...> # 写入 dependencies 属性
yarn add <package...> --dev # 写入 devDependencies 属性
- имеют
package.jsonфайл, который непосредственно используется при разработкеnpm install/yarn installкоманда, необходимые модули будут автоматически установлены в текущем каталоге, а рабочая среда и среда разработки, необходимые для установки и завершения проекта, настроены.
Упрощенные команды терминала (скрипты)
-
scriptsполеpackage.jsonФункция метаданных в , которая принимает объект, свойства которого доступны черезnpm runСценарий для запуска, значением является фактическая команда для запуска (обычно это команда терминала), например:
"scripts": {
"start": "node index.js"
},
- введите команду терминала в
scriptsполя, как для их документирования, так и для возможности повторного использования.
Определите запись проекта (основную)
-
mainполеpackage.jsonЕще одна функция метаданных в , которую можно использовать для указания загружаемого файла записи. Если ваш проект являетсяnpmpackage, когда пользователь устанавливает ваш пакет,require('my-module')то, что возвращаетсяmainфайлов, перечисленных в полеmodule.exportsАтрибуты. - когда не указано
mainполе, значение по умолчанию ниже корневого каталога модуляindex.jsдокумент.
Опубликовать конфигурацию файла (файлы)
-
filesПоля используются для описания того, что мы используемnpm publishподтолкнуть команду кnpmСписок файлов сервера.Если указана папка, будет включено все содержимое папки. - Мы можем просмотреть скачанный
antdизpackage.jsonизfilesПоле, содержание выглядит следующим образом:
"files": [
"dist",
"lib",
"es"
],
- Вы можете увидеть скачанный
antdПакеты имеют следующую структуру каталогов: - Кроме того, мы также можем настроить
.npmignoreфайл, чтобы исключить некоторые файлы и предотвратить отправку большого количества ненужных файлов вnpmначальство.
Определить частный модуль (private)
- Неоткрытые проекты общих компаний установят
privateСтоимость имуществаtrue,Это потому чтоnpmОтказаться от публикации приватных модулей.Установив это поле, можно предотвратить непреднамеренную публикацию приватных модулей.
Укажите применимую систему для модуля (os)
- Если мы разрабатываем модуль, он может работать только в
darwinВ рамках системы мы должны убедиться, чтоwindowsПользователи не будут устанавливать этот модуль, что позволит избежать ненужных ошибок. - В это время используйте
osАтрибут может помочь нам достичь вышеуказанных требований.Этот атрибут может указывать систему, к которой применим модуль, или указывать черный список системы, который не может быть установлен (сообщается об ошибке, когда модуль установлен в системе в системном черном списке). ):
"os" : [ "darwin", "linux" ] # 适用系统
"os" : [ "!win32" ] # 黑名单
Советы: в
nodeможно использовать в окружающей средеprocess.platformдля определения операционной системы.
Указанный модуль относится к архитектуре процессора (cpu)
- и выше
osполя похожи, мы можем использоватьcpuПоля точнее ограничивают среду установки пользователя:
"cpu" : [ "x64", "ia32" ] # 适用 cpu
"cpu" : [ "!arm", "!mips" ] # 黑名单
Советы: в
nodeможно использовать в окружающей средеprocess.archсудитьcpuАрхитектура.
Укажите версию узла проекта (движки)
- Иногда, когда новый проект затягивается из-за использования других разработчиков
nodeРазличные версии будут вызывать много странных проблем (например, некоторые ошибки установки зависимостей, запуск проекта после установки зависимостей и т. д.). - Для того, чтобы достичь великого идеала проекта из коробки, это время можно использовать
package.jsonизenginesполе для указания версии узла проекта:
"engines": {
"node": ">= 8.16.0"
},
- В этом поле также можно указать применимый
npmВерсия:
"engines": {
"npm": ">= 6.9.0"
},
- Следует отметить, что атрибуты движков функционируют только как описание, когда версия пользователя не соответствует указанному значению, не зависящему от влияния установки.
Пользовательская команда (бин)
- использовал
vue-cli,create-react-appДрузья строительные леса, интересно, если вам было любопытно, почему после установки этих строительных лесов вы можете использовать аналогичныеvue create/create-react-appтакие как команды, на самом деле это иpackage.jsonсерединаbinсвязанные с полем. -
binПоле используется для указания местоположения исполняемого файла, соответствующего каждой внутренней команде. когдаpackage.jsonпри условииbinПосле поля это эквивалентно выполнению сопоставления между именем команды и именем локального файла. - Когда пользователь устанавливает с
binполевой пакет,- Если установлена глобально,
npmбудет использовать символические ссылки, чтобы связать эти файлы с/usr/local/node_modules/.bin/; - Если он установлен локально, он будет ссылаться на
./node_modules/.bin/.
- Если установлена глобально,
- Например 🌰, если вы хотите использовать
my-app-cliВ качестве команды можно настроить следующееbinПоле:
"bin": {
"my-app-cli": "./bin/cli.js"
}
- Приведенный выше код указывает,
my-app-cliИсполняемый файл, соответствующий команде,binв подкаталогеcli.js, поэтому после установкиmy-app-cliВ проекте пакета его можно легко использоватьnpmВыполните скрипт:
"scripts": {
start: 'node node_modules/.bin/my-app-cli'
}
- Эй, как это выглядит
vue create/create-react-appТакие заказы не очень похожи? причина:- при необходимости
nodeнужно добавить окружениеnodeприставка - Если вы добавите
nodeпрефикс, необходимо указатьmy-app-cliпуть ->node_modules/.bin,иначеnode my-app-cliбудет искать текущий путьmy-app-cli.js, что точно не правильно.
- при необходимости
- Чтобы добиться чего-то вроде
vue create/create-react-appкоманды, подобные приведенным выше, вы можете использоватьbinИсполняемые файлы в подкаталогахcli.jsВ первой строке напишите следующую команду:
#!/usr/bin/env node
- Цель этой команды — указать системе использовать
nodeParse, поэтому команду можно сократить какmy-app-cli.
Реагировать на проект, связанный с
Установите корневой путь приложения (домашняя страница)
- когда мы используем
create-react-appстроительные лесаReactпроекта по умолчанию используется встроенныйwebpackконфигурация, когдаpackage.jsonне настроен вhomepageпуть к приложению файлового ресурса по умолчанию после упаковки сборки/,Как показано ниже: - Вообще говоря, наши упакованные статические ресурсы будут развернуты в
CDNДля того, чтобы наше приложение знало, куда загружать ресурсы, нам нужно задать корневой путь, тогда мы можем передатьpackage.jsonсерединаhomepageПоле задает корневой путь приложения. - когда мы устанавливаем
homepageПосле атрибута:
{
"homepage": "https://xxxx.cdn/my-project",
}
- Путь упакованного ресурса будет добавлен
homepageадрес:
Среда разработки для решения междоменных задач (прокси)
- При работе над проектом с раздельным фронтом и бекендом вы столкнетесь с междоменными проблемами при вызове интерфейса.Находясь в среде разработки, вы можете настроить
package.jsonсерединаproxyЧтобы решить междоменную проблему, конфигурация выглядит следующим образом:
{
"proxy": "http://localhost:4000" // 配置你要请求的服务器地址
}
- Обратите внимание, что когда
create-react-appвыше, чем версия 2.0, когдаpackage.jsonможно настроить только вstringtype, что означает, что если вы хотите использоватьpackage.jsonЧтобы решить междоменную проблему, вы можете проксировать только один адрес сервера. - Если вы хотите проксировать несколько адресов серверов, вам необходимо установить
http-proxy-middleware,существуетsrcновый каталогsetupProxy.js:
const proxy = require("http-proxy-middleware");
module.exports = function(app) {
app.use(
proxy("/base", {
target: "http://localhost:4000",
changeOrigin: true
})
);
app.use(
proxy("/fans", {
target: "http://localhost:5000",
changeOrigin: true
})
);
};
Принимать разные значения глобальных переменных (настраиваемые поля) в зависимости от среды разработки
- Допустим есть такой компонент, при клике на компонент он перескакивает в тестовую среду в среду разработки
sentryАдрес, в формальной среде, перейти в формальную средуsentryадрес. - Во-первых, путем настройки ранее упомянутого
scriptsПоле для реализации настройки переменных окружения (NODE_ENV):
"scripts": {
"start": "NODE_ENV=development node scripts/start.js",
"build": "NODE_ENV=production node scripts/build.js",
},
- После того, как проект запущен, в коде мы можем передать
process.env.NODE_ENVдоступ кNODE_ENVценность .
Вариант первый
- Мы можем написать в компоненте код оценки, аналогичный следующему, и предоставить его в соответствии с различными средами.
sentryUrlУстановите разные значения:
let sentryUrl;
if (process.env.NODE_ENV === 'development') {
sentryUrl = 'test-sentry.xxx.com';
} else {
sentryUrl = 'sentry.xxx.com';
}
- Кажется, что в этом нет ничего плохого, но если вы обдумаете это подробно, если есть несколько компонентов, разные адреса службы (несколько служб) должны использоваться в соответствии с разными средами.Если описанный выше метод написан, будет много повторяющихся кодов суждений в проекте, и при изменении адреса службы компоненты, содержащие эти адреса службы, должны быть соответственно изменены, что явно нецелесообразно.
Вариант 2
- Решение: адрес соответствующей службы настроен в
package.json, при изменении проектаwebpackконфигурация. - Примечание. Измените
webpackНастройте проект, который необходимо извлечьwebpackКонфигурация (подробнее можно прочитать 👉:Процесс настройки проекта react + typescript). - Использовать в корневом каталоге проекта
yarn ejectПосле успешного извлечения конфигурации вы можете обнаружить, что изменения в каталоге проекта следующие: - Если требуется индивидуальный проект, он обычно находится в
configкаталог по умолчаниюwebpackКонфигурация модифицирована, тут надо обратить вниманиеconfig/path.jsа такжеconfig/env.jsДва файла:-
env.jsОсновная цель читатьenvфайл конфигурации иenvИнформация о конфигурации передается в глобальную переменнуюprocess.env; -
path.jsОсновная цель - предоставить различные пути для проекта, включая путь сборки,publicпуть и т.д.
-
- Поскольку целью этой статьи является не изучение
webpackКонфигурация здесь описывает только то, как реализовать функцию [использования различных значений глобальных переменных в соответствии со средой разработки]. - Во-первых, вам нужно
package.jsonНастройте следующее в:
"scripts": {
"start": "NODE_ENV=development node scripts/start.js",
"build": "NODE_ENV=production node scripts/build.js",
},
"sentryPath": {
"dev": "https://test-sentry.xxx.com",
"prod": "https://sentry.xxx.com"
}
- Затем измените
path.jsфайл со следующим содержимым:
// 重写 getPublicUrl 方法
const getPublicUrl = (appPackageJson, pathName) => {
let path;
switch (process.env.DEPLOY_ENV) {
case 'development':
path = require(appPackageJson)[pathName].dev;
break;
case 'production':
path = require(appPackageJson)[pathName].prod;
break;
default:
path = envPublicUrl || require(appPackageJson).homepage;
}
return path;
}
// 新增 getSentryPath 方法
const getSentryPath = (appPackageJson) => {
return getPublicUrl(appPackageJson, 'sentryPath');
}
// config after eject: we're in ./config/
module.exports = {
...,
sentryUrl: getSentryPath(resolveApp('package.json')), // 新增
};
- Последний отзыв
env.jsфайл со следующим содержимым:
// 修改 getClientEnvironment 方法
function getClientEnvironment(publicUrl) {
const raw = Object.keys(process.env)
.filter(key => REACT_APP.test(key))
.reduce(
(env, key) => {
...
},
{
NODE_ENV: process.env.NODE_ENV || 'development',
PUBLIC_URL: publicUrl,
SENTRY_URL: paths.sentryUrl // 新增
}
);
const stringified = {
...
};
return { raw, stringified };
}
- Через приведенную выше конфигурацию мы можем передать компонент
process.env.SENTRY_URLполучатьsentryАдрес сервиса сейчас хоть и выглядит сложнее первого плана, но такой заработок долгосрочный, если хотите добавить новыйsonarqubeуслугу можно реализовать таким же образом, используяpackage.jsonВы также можете четко видеть адреса, используемые текущей службой в разных средах.
Резюме 👀
- В этой статье описывается
package.jsonРазнообразие общих полей и функций конфигурации, а также примеры для углубления понимания каждогоpackage.jsonпонимания этих полей. - В дополнение к некоторым часто используемым полям, также введенным в
Reactпроектpackage.jsonПредставлены некоторые функции, которые могут быть реализованы файлом.
Если есть какие-либо упущения или ошибки в вышеуказанном содержании, пожалуйста, оставьте сообщение ✍️Укажите и продвигайтесь вперед вместе💪💪💪
Если вы считаете, что эта статья полезна для вас, 🏀🏀 оставьте свой драгоценный 👍