предисловие
В 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
Это легко понять.