предисловие
npm (Node Package Manager), менеджер пакетов для Node, большинство наших часто используемых общедоступных модулей (плагинов) или пакетов размещаются на нем, поэтому следующий подключаемый модуль, который нужно упаковать, мы просто называем его пакетом npm, это article Начните с этого простого примера и постепенно упаковывайте его — публикуйте — обновляйте — расширяйте — используйте, а затем получите относительно полный пакет npm, начните ниже.
1. Один из самых простых пакетов npm
1.1 Создайте новую папку
Можно найти место для создания папки напрямую.Лучше смысловое,чтобы легче было управлять в дальнейшем.Здесь используем терминал для создания папки:
mkdir toupper-case-project // 这里我们建了一个名为toupper-case-project的文件夹
(Друзья, которые не знакомы с командной строкой, могут проверить мой блогКомандной строки не будет? Смотри сюда)
1.2 Инициализация проекта
Используйте следующую команду в корневом каталоге проекта
npm init
В это время терминал предложит вам ввести информацию, такую как имя пакета, номер версии и т. д., следующим образом:
Конечно, вы можете пройти весь путь с возвратом каретки или использоватьnpm init -y
для создания значения по умолчаниюpackage.json
файлы, эффект тот же, а затем мы получаем следующие файлы, краткое объяснение:
// package.json
{
"name": "toupper-case-project", // 包名称,默认和你文件夹同名,可改,但是需要去npm官网搜素这个名称是否已存在,因为包名不能重复
"version": "1.0.0", // 项目默认版本号,可改,如果项目后期更新再发布,则需要修改版本号
"description": "", // 项目描述,选填,可利于SEO
"main": "index.js", // 你的包的主要入口路径,就是别人安装了你的包后系统会去这个路径找你的代码
"scripts": { // 脚本命令,后面会讲到,现在使用默认的就行
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "", // 作者,选填
"license": "ISC" // 许可证,默认即可
}
Примечание. Не забудьте удалить комментарии при использовании приведенного выше кода, json нельзя комментировать.
1.3 Создайте новый файл проекта
Новое в корневом каталогеindex.js
а такжеupper.js
Эти два файла выглядят следующим образом:
// upper.js
let toUpper = (a) => {
return a.toUpperCase();
};
export default toUpper;
// index.js
import toUpper from './upper.js';
export default toUpper;
На данный момент наш проект должен иметь только три файла, а именно:
upper.js
для логики функций проекта,index.js
для экспорта функциональных модулей,package.json
Используется для настройки связанной информации, поэтому мы поместили один из самых простыхnpm
Пакет написан, и следующим шагом является ввод релиза.
1.4 Выпуск
1. Зарегистрируйте учетную запись npm
идти кофициальный сайт нпмЗарегистрируйте учетную запись, запомните имя учетной записи, пароль и адрес электронной почты (обязательно подтвердите адрес электронной почты после получения письма).
2. Переключение источника
Это яма. Подсчитано, что на нее наступило много мелких партнеров. Ведь отечественныеnpm
Скорость впечатляет, поэтому все запускали знакомую команду:
npm install -g cnpm --registry=https://registry.npm.taobao.org
Но при публикации мы должны переключить источник обратно наnpm
, вместо источника Taobao, конечно, запустите следующую команду напрямую, чтобы решить эту проблему:
npm config set registry=http://registry.npmjs.org
Но это немного низко, чтобы сокращать взад и вперед, как это, в это времяnrm
Это пригодится,nrm
что это такое? проще говоряnrm
Это инструмент реестра, предназначенный для управления и быстрого переключения частных конфигураций.
cnpm i nrm -g
Использовать после установкиnrm ls
Команда будет выглядеть следующим образом:
*
Там, где число, это означает, какой источник является текущим источником (я сейчас в источнике Taobao). Возможно, вы сначала не отображаете *, но независимо от того, отображается он или нет, запустите его напрямую.nrm use npm
,после этогоnpm ls
, затем нашел*
указывая наnpm
Источник включен, и вы можете перейти к следующему шагу в это время.
3. Войти
npm login
Затем вам будет предложено ввести имя пользователя, пароль (в зашифрованном виде его не видно, просто введите напрямую) и адрес электронной почты, после успешного входа на котором будет отображаться:
4. Попробуйте опубликовать пакет npm
Запуск в корневом каталоге проектаnpm publish
Его можно выпустить.Если он пойдет хорошо, то он сразу будет успешным.Конечно, могут быть проблемы:
-
Первая проблема с правами доступа, возможно такая ошибка сообщается
npm ERR! Error: EPERM: operation not permitted
, тогда вы должны использовать разрешение сантехника для публикации,window + x
Вы увидите опцию терминала администратора, откройте терминал, затем войдите в систему и опубликуйте. -
Вторая — проблема с именем, то есть имя вашего пакета уже существует в npm, поэтому в
package.json
Измените имя вашего пакета на другое, а затем опубликуйте его снова, проблем быть не должно.
После успешного сброса дисплей выглядит следующим образом:
1.5 Использование наших опубликованных пакетов
Просто найдите практический проект, чтобы попробовать:
cnpm i toupper-case-project -D
Установка завершена:
Это означает, что наш пакет можно скачать и установить, а затем попробовать функцию, я попробую прямо в проекте vue, всем должно быть понятно:
Затем запустите проект:
Возьми! Итак, если мы изменим этот пакет позже, что нам делать?
1.6 Пакет обновлений
мы кладемupper.js
Измените файл:
// upper.js
let toUpper = (a) => {
return 'Hello' + a.toUpperCase();
};
export default toUpper;
Тогда не забудьте поставитьpackage.json
Номер версии в файле тоже изменился, обычно можно добавить 1.
Буду"version": "1.0.0"
изменить на"version": "1.0.1"
беги сейчасnpm publish
Вы можете напрямую перезаписать новый пакет:
Тогда как нам обновить этот пакет в практическом проекте?
-
Способ 1 (прямое обновление):
cnpm update toupper-case-project
(иногда может не обновляться полностью) -
Способ 2 (наложение установки):
cnpm i toupper-case-project -D
(это надежнее)
Затем запустите проект:
Идеально! Это самый простой пакет npm, не так ли он недосягаем, как вы думаете? Но, если честно, этого пакета очень мало, вы можете видеть, что чужие пакеты были упакованы, протестированы и могут использоваться непосредственно в методе Vue.use(), и есть взаимодействие. Тогда давайте попробуем.
2. Пакет npm на основе webpack и vue
Использование vue-cli напрямую принесет много модулей, которые нам не нужны, что слишком громоздко, поэтому давайте просто возьмем один, если это правильно.webpack
Если вы еще не знакомы с этим, посмотрите мой постСамое подробное введение в webpack4.x
2.1 Создайте проект (компонент звездного рейтинга)
Давайте инкапсулируем компонент, который отображает звездные рейтинги на основе количества переданных рейтингов, например:
Пожалуйста, перейдите к конкретному кодуgithub, пожалуйста, дайте ★ Звезда ^_~ слева, начните ниже:
Сначала создайте новый с именемstar-evaluation
папка проекта;
Затем создайте файл проекта в соответствии со следующей структурой:
|——src
| |——images
| | |——star24_half@2x.png
| | |——star24_off@2x.png
| | |——star24_on@2x.png
| |——index.js
| |——Star.vue
|——.npmignore // 用于忽略不需要上传到npm的文件
|——package.json
|——README.md
|——webpack.config.js
Файлы следующие:
Star.vue
Конкретный код выглядит следующим образом, основная цель — пройти переданные значения после их обработки.class
имя класса, затем добавьте вspan
начальство.
<!-- Star.vue -->
<template>
<div class="star">
<span class="star-item" v-for="(itemClass, index) in itemClasses" :key="index" :class="itemClass"></span>
</div>
</template>
<script>
// 星星长度
const LENGTH = 5;
// 星星状态
const CLS_ON = 'on';
const CLS_HALF = 'half';
const CLS_OFF = 'off';
export default {
data () {
return {
}
},
props: {
score: {
type: Number
}
},
computed: {
itemClasses () {
let result = [];
// 如果小数大于或等于0.5则变为0.5,否则为0
let score = Math.floor(this.score * 2) / 2;
// 全星
let integer = Math.floor(score);
// 半星
let hasHalf = score % 1 !== 0;
// 遍历全星
for (let i = 0; i < integer; i++) {
result.push(CLS_ON);
}
// 处理半星
if (hasHalf) {
result.push(CLS_HALF);
}
// 补齐,如果星数小于5,则一直循环判断填入数据,直到满足条件
while (result.length < LENGTH) {
result.push(CLS_OFF);
}
return result;
}
}
}
</script>
<style lang="scss" scoped>
.star{
font-size: 0;
.star-item{
display: inline-block;
width: 10px;
height: 10px;
margin-right: 3px;
background-repeat: no-repeat;
background-size: 10px 10px;
&:last-child{
margin-right: 0;
}
}
/* 三种图片类型*/
.on{
background-image: url(./images/star24_on@2x.png);
}
.half{
background-image: url(./images/star24_half@2x.png);
}
.off{
background-image: url(./images/star24_off@2x.png);
}
}
</style>
// index.js
import Star from './Star.vue';
export default Star;
package.json
Зависимости настроены следующим образом:
{
"name": "star-evaluation",
"version": "1.0.0",
"description": "A plugin which use stars number to evaluate",
"main": "dist/bundle.js",
"scripts": {
"build": "webpack --mode production",
"dev": "webpack-dev-server --open --mode development"
},
"repository": {
"type": "git",
"url": "git+https://github.com/Better-Alan/star-evaluation.git"
},
"keywords": ["star", "evaluation"],
"author": "BetterMan",
"license": "ISC",
"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",
"node-sass": "^4.9.4",
"sass-loader": "^7.1.0",
"style-loader": "^0.23.1",
"url-loader": "^1.1.2",
"vue": "^2.5.17",
"vue-hot-reload-api": "^2.2.4",
"vue-html-loader": "^1.2.4",
"vue-loader": "^15.4.2",
"vue-router": "^3.0.1",
"vue-style-loader": "^3.0.3",
"vue-template-compiler": "^2.5.9",
"webpack": "^4.23.1",
"webpack-cli": "^3.1.2"
}
}
webpack.config.js
Конфигурация следующая, для/src
Содержимое пакета для/dist
(Он будет автоматически сгенерирован при упаковке/dist
папка) вbundle.js
,bundle.js
По сути, он эквивалентен нашему плагину.
// webpack.config.js
const path = require('path'); // 路径处理模块
const { VueLoaderPlugin } = require('vue-loader');
module.exports = {
entry: {
index: path.join(__dirname, "/src/index.js") // 入口
},
output: {
path: path.join( __dirname, "/dist"), // 打包后的文件存放的地方
publicPath: '/dist/', // 设置公共路径
filename: "bundle.js", // 打包后输出文件的文件名
libraryTarget: 'umd' // 将你的library暴露为所有的模块定义下都可运行的方式,它将可在 CommonJS, AMD 环境下运行
},
module: {
rules: [
{
test: /\.vue$/, // vue-loader
loader: 'vue-loader'
},
{
test: /\.css$/, // 正则匹配以.css结尾的文件
use: ['style-loader', 'css-loader']
},
{
test: /\.(scss|sass)$/, // 正则匹配以.scss和.sass结尾的文件
use: ['style-loader', 'css-loader', 'sass-loader'] // 需要用的loader,一定是这个顺序,因为调用loader是从右往左编译的
},
{
test: /\.(png|jpg|svg|gif)$/, // 图片loader
use: ['url-loader']
},
{
test: /\.js$/,
exclude: /node_modules|vue\/dist|vue-router\/|vue-loader\/|vue-hot-reload-api\//,
loader: 'babel-loader'
}
]
},
plugins: [
new VueLoaderPlugin()
]
}
.npmignore
(не забудьте предыдущую точку) файл используется для игнорирования файлов, правил и.gitignore
Такой же. Если в вашем проекте есть.gitignore
но нет.npmignore
, буду использовать.gitignore
Конфигурация.
.*
*.md
node_modules/
src/
README.md
Объяснение (не обязательно), у всех должно быть на 6 больше, чем у меня.
На данный момент наш каталог должен выглядеть так:
2.2 Зависимости установки
После настройки вышеуказанных файлов вы можете запустить следующую команду для установки зависимостей:
cnpm install
2.3 Упаковка проекта
Упакуйте проект после установки зависимостей:
npm run build
2.4 Войдите и опубликуйте (убедитесь, что вы находитесь в исходном коде npm)
Запуск после завершения упаковкиnpm login
после входаnpm publish
выпускать:
Релиз сделан! , можно использовать? Давайте попробуем.
2.5 Попробуйте наш пакет npm
- Загрузите сначала:
cnpm i star-evaluation -D
- Введено в проект с использованием:
После запуска отображается следующее:
Понял, это лучше, чем предыдущее?toupper-case-project
Плагины настолько высокого класса?
Некоторые друзья могут сказать: «Плагины, которые я обычно вижу, используются не так, многие из них напрямуюVue.use()
Его можно использовать позже, а также в плагине есть события. "
Что ж, давайте еще раз изменим?
3. Пакет обновлений
Может действительно использоватьVue.use()
Этот способ вызова компонента зависит от того, настроен ли онinstall
метод, мы даемStar.vue
Компоненты плюс взгляните на:
3.1 Настройте метод установки
// index.js
import Star from './Star.vue';
Star.install = Vue => Vue.component(Star.name, Star); // 给Star组件配置install方法,注册该组件
export default Star;
Примечание: здесь есть на что обратить внимание, т.
Star.name
это указать нам наStar.vue
настроено в файлеname
свойства, не забудьте настроить его:
Это сделано сейчасVue.use()
Теперь давайте добавим взаимодействие события и создадим компонент щелчка, чтобы всплывало определенное значение звезды!
3.2 Добавить события
Конкретные модификации заключаются в следующем:
<!-- Star.vue -->
<template>
<!-- 绑定showNumber方法 -->
<div class="star" @click="showNumber">
<span class="star-item" v-for="(itemClass, index) in itemClasses" :key="index" :class="itemClass"></span>
</div>
</template>
<script>
...
export default {
name: 'Star', // 别忘加上这个属性
...
methods: {
showNumber() {
this.$emit('showNumber', '我是弹出的信息'); // 将自定义方法showNumber暴露出去,且将参数传出
}
}
}
</script>
...
3.3 Пакет-публикация-использование
Все еще старая процедура, измените номер версии - пакет - выпуск, а затем мы приступаем к практическому проекту.cnpm i star-evaluation -D
Установите его снова, потому что иногдаnpm update star-evaluation
Способ не очень надежный и обновление не полное.
Затем мы используем его в практическом проектеVue.use()
Метод и тестовое событие используются в файле подключаемого модуля следующим образом:
<template>
<div class="hello">
<!-- 子组件所传出的自定义showNumber方法调用当前showMessage方法 -->
<Star @showNumber="showMessage" :score="2.6"/>
</div>
</template>
<script>
import Vue from 'vue' // 引入Vue
import Star from 'star-evaluation'; // 引入Star插件
Vue.use(Star) // 使用Star插件
// 以上的引入和注册一般是在main.js中统一完成,这个大家应该都比较熟悉
export default {
// 因为使用了Vue.use(Star)方式,所以这里不需要使用components: {Star}来注册插件
methods: {
// 点击组件触发此方法
showMessage(mes) {
alert(mes);
}
}
}
</script>
<style scoped>
</style>
тогда мыnpm run dev
Перезапустите включенный проект и щелкните компонент, чтобы отобразить следующее:
Возьми! Разве это не сложно?
наконец
Изначально я планировал просто расписать основные шаги, но не ожидал, что буду писать (многословно) так долго. Пожалуйста, дайте мне совет, если я пишу не так. Если это может вам помочь, это тоже хлопотно.githubДайте звезду, чтобы я мог уверенно двигать кирпичи ↓-↓