Адрес источникаЕсли вам полезно, я надеюсь не быть скупой со своей звездой
В этой статье на основе записи о том, какVue
компонентов развития, а вnpmОпубликован в. Без лишних слов, давайте к делу
Плагин разработки Vue
Посмотрите на официальный сайт перед разработкойспецификация разработки
Ожидаемый результат после нашей разработки — поддержка импорта, требования или импорта напрямую с использованием тегов скрипта, например:
// 这里注意一下包的名字前缀是 custom ,组件的名字前缀是 moor
// 这是因为那个名字发布包的时候被占用了(我做实验的时候叫 moor-ui)现在改成了custom-ui,但是组件的前缀懒得改
import CustomUI from 'custom-ui';
// 或者 const CustomUI = require('custom-ui');
// 或者 <script src="..."></script>
Vue.use(CustomUI);
Создайте проект Vue
Компоненты разработки, которые мы используемwebpack-simple
:
vue init webpack-simple <project-name>
PS:Здесь я выбрал использование sass, потому что он будет использоваться позже при разработке компонентов.
Файловая структура компонента разработки выглядит следующим образом, см.elementНо у нас упрощенная версия, только для совместного использования и собственного использования.
.
├── src/ // 源码目录
│ ├── packages/ // 组件目录
│ │ ├── switch/ // 组件(以switch为例)
│ │ ├── moor-switch.vue // 组件代码
│ │ ├── index.js // 挂载插件
│ ├── App.vue // 页面入口
│ ├── main.js // 程序入口
│ ├── index.js // (所有)插件入口
├── index.html // 入口html文件
.
Что ж, на этом подготовка завершена, мы можем приступить к разработке компонентов, а затем приведенный выше пример, давайте приступим к разработкеswitch
компоненты.
разработать один компонент
Сначала посмотрите на целевой эффект:
Начните разработку: создайте новую папку переключателя в папке пакетов для хранения исходного кода компонента переключателя и продолжайте создавать файлы moor-switch.vue и index.js в папке переключателя.
moor-switch.vue
Этот файл является исходным кодом компонента. Я не буду приводить сюда исходный код. Здесь я расскажу о том, что я лично считаю самым важным моментом. Это также самый важный момент для инкапсуляции компонентов формы:
v-модель привязки пользовательского компонента,Адрес официального сайта
использовать:
<!-- 使用父组件的值绑定 -->
<!-- isSwitch = false -->
<moor-switch
v-model="isSwitch">开关:
</moor-switch>
<!-- 子组件必须要有 input 来处理对应的值 -->
<!-- 其中最重要的就是需要 :value="value" 用来绑定值 -->
<!-- @change="$emit('input', $event.target.value)" 事件触发改变值 -->
<input
type="checkbox"
@change="$emit('input', $event.target.value)"
:true-value="activeValue"
:false-value="inactiveValue"
:disabled="disabled"
:value="value">
<!-- 当然还需要使用 props 来接受这个 value -->
<script>
// ... 此处省略代码
props: {
value: {
type: [Boolean, String, Number],
default: false
}
}
// ... 此处省略代码
</script>
index.js
Об этом файле нечего сказать, так как компонент используется как плагин Vue, а код здесь всего три строки:
// MoorSwitch 是对应组件的名字,要记得在 moor-switch.vue 文件中还是 name 属性哦
import MoorSwitch from './moor-switch';
MoorSwitch.install = Vue => Vue.component(MoorSwitch.name, MoorSwitch);
export default MoorSwitch;
Хорошо в принципе сделано, но для того, чтобы централизовать все компоненты, как у меняselect
,input
,button
и другие компоненты, то я хочу поместить их в один файл для удобства управления
Итак, я создал новый файл index.js в той же директории, что и App.vue, и о содержимом тут говорить нечего, просто смотришь и понимаешь:
import HelloWorld from './packages/hello-world/index.js';
import MoorSwitch from './packages/switch/index.js';
// ...如果还有的话继续添加
const components = [
HelloWorld,
MoorSwitch
// ...如果还有的话继续添加
]
const install = function(Vue, opts = {}) {
components.map(component => {
Vue.component(component.name, component);
})
}
/* 支持使用标签的方式引入 */
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue);
}
export default {
install,
HelloWorld,
MoorSwitch
// ...如果还有的话继续添加
}
запускать локально через<script/>
Способ использования тегов, измененныйindex.html
документ:
<!-- 省略部分代码 -->
<div id="app">
<moor-hello-world :color="color" :msg="msg"></moor-hello-world>
<moor-switch
v-model="lightSwitch">开关:</moor-switch>
</div>
<script src="./node_modules/vue/dist/vue.js"></script>
<script src="/dist/custom-ui.js"></script>
<script>
new Vue({
el: '#app',
data() {
return {
color: 'red',
msg: 'hello world!',
lightSwitch: false
}
}
})
</script>
затем бегиnpm run dev
Вы можете увидеть эффект:
Ну вот и разрабатываются наши компоненты, начнем с того, как их упаковать и опубликовать в npm
Опубликовать в нпм
Перед упаковкой сначала нам нужно изменитьwebpack.config.js
этот файл;
// ... 此处省略代码
// 执行环境
const NODE_ENV = process.env.NODE_ENV
module.exports = {
// 根据不同的执行环境配置不同的入口
entry: NODE_ENV == 'development' ? './src/main.js' : './src/index.js',
output: {
// 修改打包出口,在最外级目录打包出一个 index.js 文件,我们 import 默认会指向这个文件
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'custom-ui.js',
library: 'custom-ui', // 指定的就是你使用require时的模块名
libraryTarget: 'umd', // libraryTarget会生成不同umd的代码,可以只是commonjs标准的,也可以是指amd标准的,也可以只是通过script标签引入的
umdNamedDefine: true // 会对 UMD 的构建过程中的 AMD 模块进行命名。否则就使用匿名的 define
},
// ... 此处省略代码
}
Исправлятьpackage.json
документ:
// 发布开源因此需要将这个字段改为 false
"private": false,
// 这个指 import custom-ui 的时候它会去检索的路径
"main": "dist/custom-ui.js",
Издание приказа на самом деле два предложения
// 这里需要你有一个 npm 的账号,文章开头有官网链接
npm login // 登陆
npm publish // 发布
После завершения можем установить и использовать в проекте
npm install custom-ui -S
существуетmain.js
Внедрить плагины в
import CustomUI from 'custom-ui'
Vue.use(CustomUI)
Использование в компоненте:
<!-- 直接使用脚手架的HelloWorld组件 -->
<!-- 此处有省略代码,看对地方加入代码哦 -->
<div class="moor-item">
<label>Input: </label>
<moor-input
v-model="input1"
placeholder="请输入信息">
</moor-input>
<moor-input
v-model="input2"
placeholder="请输入信息">
</moor-input>
<moor-input
placeholder="输入框禁用"
:disabled="inputDisabled">
</moor-input>
</div>
<div class="moor-item">
<label>Switch: </label>
<moor-switch
v-model="lightSwitch">开关(开):</moor-switch>
<moor-switch
v-model="switchLight">开关(关):</moor-switch>
</div>
<script>
export default {
name: 'HelloWorld',
data () {
return {
// HelloWorld
msg: 'Welcome to moor UI!',
color: 'red',
// input
input1: '',
input2: '这是默认值',
inputDisabled: true,
// switch
lightSwitch: false,
switchLight: true
}
},
watch: {
lightSwitch: newValue => console.log('开关:', newValue),
}
}
</script>
<style scoped>
.moor-select, .moor-btn, .moor-switch, .moor-input {
margin: 10px 6px;
}
.moor-item {
display: flex;
align-items: center;
}
.moor-item label {
width: 100px;
display: inline-block;
}
</style>
Эффект предварительного просмотра выглядит следующим образом:
PS:Измените .gitignore, чтобы убрать ignore dist, потому что наши упакованные файлы тоже нужно отправлять, каждый раз при переходе в npm нужно менять номер версии, поле версии в package.json
Писать относительно просто, в основном для того, чтобы давать идеи. Если вы привыкли к компонентам с открытым исходным кодом, вы должны понимать это сами.Иногда нам необходимо разработать свои собственные компоненты с открытым исходным кодом, когда мы не можем найти подходящий компонент с открытым исходным кодом в процессе разработки....
Наконец, я надеюсь, что вы дадите звездуАдрес источника
О, кстати, README, больше не хочу писать... ха-ха