Предисловие 🤔
- В корневом каталоге каждого проекта обычно находится
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-name
package, чтобы определить, допустимо ли имя модуля); - Имена семантических модулей могут помочь разработчикам найти необходимые модули быстрее и избегайте случайного приобретения неправильного модуля;
- Если в имени модуля есть некоторые символы, символы не должны повторяться с существующим именем модуля после удаления их, например: поскольку
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
Еще одна функция метаданных в , которую можно использовать для указания загружаемого файла записи. Если ваш проект являетсяnpm
package, когда пользователь устанавливает ваш пакет,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
- Цель этой команды — указать системе использовать
node
Parse, поэтому команду можно сократить как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
можно настроить только вstring
type, что означает, что если вы хотите использовать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
Представлены некоторые функции, которые могут быть реализованы файлом.
Если есть какие-либо упущения или ошибки в вышеуказанном содержании, пожалуйста, оставьте сообщение ✍️Укажите и продвигайтесь вперед вместе💪💪💪
Если вы считаете, что эта статья полезна для вас, 🏀🏀 оставьте свой драгоценный 👍