предисловие
Это руководство по публикации npm, которое не включает обучение., чтобы не делиться многими статьями, выполняйте шаги шаг за шагом и, наконец, не сможете отправить посылку. . Время уходит, а я в плохом настроении.
Поэтому при написании этой статьи [2019-08-18] я пересобрал пакет npm и выпустил пакет npm в соответствии со следующим процессом, который также был протестирован и доступен, поэтому детская обувь может быть уверена, что будет следовать шаг за шагом и учиться опубликовать пакет npm.Код проекта пакета здесь,Адрес пакета npm, который был выпущен онлайн, находится здесь.
Я считаю, что фронтендеры не будут незнакомы с пакетами npm,npmПервоначально это был инструмент управления пакетами для Node.js, но с активным развитием JS в последние годы npm теперь стал инструментом управления почти всеми инструментами и пакетами, связанными с JS, и на этот раз он также будет от 0 до 1 пройти процесс отправки посылки,
1. В этой статье в качестве примера для объяснения используется проект vue. Процесс можно использовать в целом, но установка конкретных проектов немного отличается. Независимо от vue или react, я считаю, что это будет полезно для всех.
2,⚠️Советы: Чтобы детская обувь могла понять процесс и конфигурацию упаковки, рекомендуется выполнить шаги (1)-(10).Чтобы выделить весь процесс упаковки, упакованные тестовые компоненты очень просты. После понимания содержимого и конкретных принципов работы всех файлов и успешного выпуска тестового пакета npm детская обувь может заменить его своими компонентами и опубликовать собственный пакет npm.Имя дистрибутива задано как
our-btn
Инициализировать проект webpack + упаковка компонентов === за один раз
В проекте мы все хотим, чтобы установленные плагины были как можно меньше, поэтому мы должны стараться изо всех сил контролировать наши зависимости при выпуске пакетов, поэтому я предпочитаю создавать упакованный проект самостоятельно, а не использовать громоздкий vue и реагировать леса . Без лишних слов, давайте сделаем это 👇
- (1) Ниже приведена рекомендуемая структура каталогов, и файл проекта создается в соответствии со следующей структурой.
Однако, поскольку компоненты этой статьи слишком просты, она удалена.
assets,utilsПапки (наличие этих двух папок не влияет на npm-пакет, вам только удобно организовать код проекта самостоятельно)
├── src
│ ├── assets # 本地静态资源(本文没有)
│ ├── components # 业务通用组件
│ │ ├── btnDemo.vue # 本文需要封装的简单button组件
│ ├── utils # 工具库(本文没有)
│ └── index.js # 应用入口
├── .npmignore // 用于忽略不需要上传到npm的文件
├── README.md
├── package-lock.json
├── package.json
└── webpack.config.js # webpack配置
// 注意
# utils 文件夹一般存放的是你组件经常使用的一些工具函数
# assets 文件夹一般存放的是你组件用到的样式、图片、icon等静态资源
- (2)
button组件
// btnDemo.vue
<template>
<div class="btn">
<button>{{text}}</button>
</div>
</template>
<script>
export default {
name: 'btn', // 组件的name属性(后面有提到这里有个坑)
props: {
text: { // 文本
type: String,
default () {
return ''
}
}
},
data () {
return {
}
}
}
</script>
- (3)
index.js
Этот файл предназначен для демонстрации наших компонентов
// src/index.js
// 这里import 的 btn和btnDemo.vue的name属性名相同 !
import btn from './btnDemo.vue'
btn.install = Vue => Vue.component(btn.name, btn) // 给组件配置install方法
export default btn;
⚠️ (Здесь яма): Потому что
Vue.component(btn.name, btn)изbtn.nameуказывает наbtnDemo.vueизnameсвойства, поэтому рекомендуется использоватьnameзначение атрибута какimportпсевдоним
- (4)
webpack.config.js
webpack.config.jsКонфигурация выглядит следующим образом, так как версия, которую мы используем,webpack4, все конфигурации вwebpack.config.jsВнутри нам нужно только упаковать наши ресурсы здесь, и написание относительно простое.webpackДетали конфигурации можно узнатьофициальная документация
Эта конфигурация используется для/srcСодержимое пакета для/dist(Он будет автоматически сгенерирован при упаковке/distпапка) вbtn.js,btn.jsПо сути, он эквивалентен нашему плагину (позже вpackage.jsonизmainФилд тоже указывает сюда)
// webpack.config.js
const path = require('path')
const { VueLoaderPlugin } = require('vue-loader')
module.exports = {
entry: {
index: path.join(__dirname, "/src/index.js") // 入口文件(就是刚才用于暴露组件的index.js)
},
output: {
path: path.join( __dirname, "/dist"), // 打包后的文件存放在dist文件夹
publicPath: '/dist/', // 设置公共路径
filename: "btn.js", // 打包后输出文件的文件设置为btn.js
libraryTarget: 'umd' // 这个选项会尝试把库暴露给前使用的模块定义系统,这使其和CommonJS、AMD兼容或者暴露为全局变量
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.(scss|sass)$/,
use: ['style-loader', 'css-loader', 'sass-loader']
},
{
test: /\.(png|jpg|svg|gif)$/,
use: ['url-loader']
},
{
test: /\.js$/,
exclude: /node_modules|vue\/dist|vue-router\/|vue-loader\/|vue-hot-reload-api\//,
loader: 'babel-loader'
}
]
},
plugins: [
new VueLoaderPlugin()
]
}
- (5)
package.json
package.jsonПоля следующие, следует подчеркнуть, что поляdevDependenciesЗависимости в не уникальны, вы можете написать в соответствии со своей ситуацией,Но в этот момент, пожалуйста, будьте как я, это также для того, чтобы вы могли следить за моей операцией и успешно отправить посылку.
// 具体字段后面详细说明
{
"name": "our-btn", // 发布npm包的名字
"version": "1.0.0", // 你的npm包版本
"description": "A test button", // 包的描述
"main": "dist/btn.js", // *重点*:指定你组件的主入口文件
"scripts": {
"build": "webpack --mode production",
"dev": "webpack-dev-server --open --mode development"
},
"keywords": [
"our-btn",
"button"
],
"repository": {
"type": "git",
"url": "git+https://github.com/thomaszhou63/test-npm.git"
},
"author": "thomaszhou",
"license": "MIT",
"devDependencies": {
"babel-core": "^6.26.3",
"babel-loader": "^7.1.5",
"babel-preset-env": "^1.7.0",
"css-loader": "^1.0.0",
"file-loader": "^2.0.0",
"style-loader": "^0.23.1",
"url-loader": "^1.1.2",
"node-sass": "^4.12.0",
"sass-loader": "^7.2.0",
"vue": "^2.5.2",
"vue-hot-reload-api": "^2.2.4",
"vue-html-loader": "^1.2.4",
"vue-loader": "^15.4.2",
"vue-style-loader": "^3.0.3",
"vue-template-compiler": "^2.5.9",
"webpack": "^4.19.0",
"webpack-cli": "^3.1.0"
}
}
- Параметр Описание
-
name- Название пакета (название пакета должно быть в кебабном регистре, то есть английские слова все в нижнем регистре или разделены тире) -
version- номер версии пакета (рекомендуется для первой версии1.0.0, специальные правила именованияСмотри сюда) -
description- Описание пакета. существуетnpmjs.comотображается при поиске в Интернете, что помогает пользователям фильтровать при поиске) -
keywords- Ключевые слова (ищите ключевые слова вашего пакета npm на веб-сайте npm) -
author- Автор пакета. Формат, как правило,name <你的邮箱>, в общем, сvue/reactКогда scaffolding создает проект, он будет записан в этом формате по умолчанию.Конечно, это также может быть адрес github, или его можно настроить, но это не так стандартно. -
license- авторская лицензия,MITещеISC, или что-то еще, но я вижу много пакетовMIT -
contributors- другие участники пакета (я этого не писал) -
repository- код пакетаRepoинформация, в том числеtypeа такжеURL,typeвозможноgitилиsvn,URLупакованRepoадрес- Я написал это здесь
gitАдрес склада, где размещен код проекта моего компонента, чтобы на странице пакета npm была запись github
- Я написал это здесь
-
main- В этом поле указывается основной входной файл программы (желательно написанныйdist文件夹сжатые файлы)-
mainОпределите входной файл пакета,NodeJsокружение, заявлениеimport [pkg] from '[package]'Когда, по сути, импортируется файл, определяемый main
-
-
scripts- указывает аббревиатуру командной строки npm для запуска команды скрипта. Такие какnpm start,npm run dev,npm run buildЖдать -
dependencies/devDependencies- Список зависимостей среды производства/разработки. они будут установлены вnode_moduleПод содержанием- Для разработчика,
dependenciesа такжеdevDependenciesНа самом деле особой разницы нет, т.к. в реализацииnpm install/yarn addскачает все -
dependenciesэто зависимость, которая должна быть установлена для запуска вашего пакета, т.е. когда пользовательnpm install [package]илиyarn add [package], эти зависимости также загружаются devDependenciesэто зависимость, которую необходимо установить при разработке пакета, напримерeslint,jestи другие средства разработки, когда пользовательnpm install [package]илиyarn add [package], эти зависимости не скачиваются!
- Для разработчика,
-
Моя версия здесь 1.0.1, потому что я повторил версию позже.Если вы первая версия, лучше быть 1.0.0
- (6)
README.md
это моеREADME.mdНапишите что-нибудь, в конечном итоге будет отображаться в контенте npm, введенном внутри (то есть выше), детская обувь, если вы предлагаете цену, пожалуйста, напишитеREADME.mdХа, в конце концов, это для людей.
## our-btn
>一个测试的npm包
# install
```
npm install our-btn
```
# use
```
// main.js
import btn from 'our-btn'
Vue.use(btn)
```
```
// demo.js
<template>
<div class="demo">
<btn :text="msg"></btn>
</div>
</template>
<script>
export default {
name: 'demo',
data () {
return {
msg: '成功'
}
}
}
</script>
```
- (7)
.npmignore
Этот файл такой же, как.gitignoreта же функция,.gitignoreзаключается в игнорировании необязательных файлов, загруженных в репозиторий github, и.npmignoreЭто игнорировать выбранные файлы и загружать их в npm.
Но что, если ваш проект не.npmignoreфайл, но с.gitignoreфайл, он будет проигнорирован при публикации.gitignoreфайл, определенный в; то есть,.npmignoreприоритет выше, чем.gitignoreиз.
.*
*.md
node_modules/
webpack.config.js
src/
- (8) Зависимости установки
После настройки вышеуказанных файлов вы можете запустить следующую команду для установкиpackage.jsonЗатем зависимости генерируются в вашем каталоге.node_modulesпапка,package-lock.jsonдокумент
npm install
- (9) Упаковка наших компонентов
npm run build
- (10) Структура каталогов
На следующем рисунке показана моя структура каталогов, в которой.gitattributesа также.gitignoreНа файлы можете не обращать внимания, потому что я выложил этот проект в репозиторий github, так что там эти два файла.
Доступен ли локальный тестовый компонент
Выполните следующую команду в проекте
npm run build // 打包
npm pack // 本地生成一个our-btn-1.0.1.tgz的包
Вы создаете новый локальноvue/reactпроект, потому что я являюсь компонентом vue, поэтому я создам новый проект vue с именемtest-btn, мы положилиour-btn-1.0.1.tgzПоставить наш местный проектtest-btnсередина
npm install our-btn-1.0.1.tgz
npm run dev // 启动vue项目
тогда в проектеmain.jsимпортировать наш пакет
// src/main.js
// 注意:btn要保持和之前咱们封装组件的index.js一样
import btn from 'our-btn' // 引入包
Vue.use(btn)
Ссылайтесь на этот компонент на нашей демонстрационной странице.
// demo.vue
<template>
<div class="demo">
<btn :text="msg"></btn>
</div>
</template>
<script>
export default {
name: 'demo',
data () {
return {
msg: '成功'
}
}
}
</script>
Если тест доступен, в тестовом проектеtest-btnвбегаетnpm uninstall our-btnУдалите плагин, затем вы можете опубликовать пакет NPM
Опубликовать в нпм
- (1) Зарегистрируйте учетную запись npm
Перед публикацией вы должны зарегистрировать npm-аккаунт, иначе как вы можете его загрузить, рекомендуется перейти наОфициальная регистрация на сайтеУчетная запись (кстати, знакомая с сайта), после регистрации учетной записи мы войдем локально и опубликуем наши компоненты
Совет: поскольку в некоторых моделях детской обуви часто используется источник cnpm, поэтомуВы должны переключиться на источник npm., иначе будет сообщено о следующей ошибке
error: no_perms Private mode enable, only admin can publish this moduleПоэтому вам нужно переключиться на источник npm через
npm config set registry http://registry.npmjs.orgЗаказ
- (2) Начать публикацию
Перед отправкой посылки зайдитеофициальный сайт нпмВыполните поиск, чтобы увидеть, есть ли пакет с таким же именем, как у вас, если он такой же, измените его на другое имя.
npm login // 登陆npm
// 然后输入你的账号、密码、邮箱
// 当你在控制台看到 Logged in as <Username> on https://registry.npmjs.org 说明登陆成功
// 如果你保证是最新版本且已经打包过,则跳过npm run build这一步
npm run build
npm publish // 发布你的包(如果你出现👇,显示 +[package]@版本信息 ,那就发布成功了)
👇 Вот мой ввод и соответствующий ему дисплей
🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉 На данный момент ваш пакет успешно выпущен! ! ! 🎉🎉🎉🎉🎉🎉🎉🎉🎉
⚠️расширить знания: Версия может быть выпущена только один раз, то есть вы не можете опубликовать
1.0.0, продолжить в следующий раз1.0.0, Теоретически его можно перезаписать, но npm этого не позволяет, потому что если так перезаписать, то нельзя будет узнать информацию о своей версии.Плагины и проекты итеративны, как и git, есть информация о версии. Способ 1: каждый раз
npm publishраньше меняй вручнуюpackage.jsonверсия Способ 2: опубликовать с помощью следующей команды
假设初始版本为1.0.0 ➜ npm version preminor (执行这个命令,就会价格当前包发布为版本v0.1.0-0) v1.0.0-0 ➜ npm version prepatch v1.0.1-0 ➜ npm version patch (执行这个命令,就会价格当前包发布为版本v1.0.1) v1.0.1
Проверьте npm && используйте наши пакеты
В это время вы ждете несколько минутофициальный сайт нпмНайдите имя своего пакета, чтобы найти его. Если вы не можете его найти, то подождите, возможно, обновление медленное и не полностью обновлено, но вы можете просмотреть выпущенный вами пакет в своей учетной записи npm.
Вы создаете новый локальноvue/reactпроект, потому что я являюсь компонентом vue, поэтому я создам новый проект vue.Конкретный метод использования пакета (возьмите мой тестовый пакет в качестве примера)
npm install our-btn // 安装我们的包
тогда в проектеmain.jsимпортировать наш пакет
// src/main.js
// 注意:btn要保持和之前咱们封装组件的index.js一样
import btn from 'our-btn' // 引入包
Vue.use(btn)
Ссылайтесь на этот компонент на нашей демонстрационной странице.
// demo.vue
<template>
<div class="demo">
<btn :text="msg"></btn>
</div>
</template>
<script>
export default {
name: 'demo',
data () {
return {
msg: '成功'
}
}
}
</script>
如果错误请指正,我也好纠错更新
如有讲的不明白的,请留言,我看到会回复
over