# 项目创建

# 一、使用脚手架创建一个 vue 项目

vue create m-baseui 快速初始化一个项目

# 二、修改和创建目录

1. 将 src 文件夹修改为 examples

2. 创建 packages 文件夹,用来进行组件编写

img

描述:

  • packages/components : 存放组件。
  • packages/styles : 存放全局样式和组件样式。
  • packages/index.js :

# 3. 在根目录下新建一个 vue.config.js 文件,配置如下

cli 默认会启动 src 下的服务,如果目录名变了,我们需要手动修改配置,修改入口文件地址为 examples 下的 main.js, 将 packages 加入打包编译任务中

module.exports = {
  pages: {
    index: {
      entry: 'examples/main.js',
      template: 'public/index.html',
      filename: 'index.html'
    }
  },
  // 扩展 webpack 配置,使 packages 加入编译
  chainWebpack: config => {
    config.module
      .rule('js')
      .include
        .add('/packages')
        .end()
      .use('babel')
        .loader('babel-loader')
  }
}

# 4.npm run serve 运行项目,可以正常启动项目

# 5. 在 router 中添加路由

import { createRouter,createWebHistory } from 'vue-router'
 
const routes = [
  {
    path: '/',
    name: 'Home',
    component: () => import('../views/Home.vue'),
    children: [
      {
        path: '/button',
        name: 'Button',
        component: () => import('../views/Button.vue')
      },
      {
        path: '/input',
        name: 'Input',
        component: () => import('../views/Input.vue')
      }
    ]
  },
]
 
const router = createRouter({
  history: createWebHistory(),
  routes
})
 
export default router

# 组件编写

# 一、packages 中,编写一个测试的 Button 组件

img

# 二、components 中的 Button.vue 代码

<template>
  <button
    class="m-button"
    :class="styleClass"
    :disabled="disabled"
    :round="round">
    <slot></slot>
  </button>
</template>
 
<script>
import { computed } from 'vue';
export default {
  name: 'm-button',
  props: {
    type: {
      type: String,
      default: 'default',
      validator(value) {
        return ['default','primary', 'success', 'info', 'warning', 'danger','text'].indexOf(value) > -1;
      }
    },
    disabled: {
      type: Boolean,
      default: false
    },
    round: {
      type: Boolean,
      default: false
    }
  },
  setup(props) {
 
    const styleClass = computed(() => {
      return {
        [`m-button--${props.type}`]: props.type,
        'is-disabled': props.disabled,
        'is-round': props.round
      }
    })
 
    return {
      styleClass
    }
  }
}
</script>
 
<style lang="scss" scoped>
@import '../../../styles/components/button.scss';
</style>

# 三、styles 中的 button 样式代码

.m-button {
  display: inline-block;
  padding: 12px 20px;
  margin-left: 10px;
  border: 1px solid #d9d9d9;
  background: #fff;
  color: #333;
  cursor: pointer;
}
.is-disabled{
  color: #c0c4cc;
  cursor: not-allowed;
  background-color: #fff;
  border-color: #ebeef5;
}
.m-button--primary{
  color: #fff;
  background-color: #409eff;
  border-color: #409eff;
}
.m-button--success {
  color: #fff;
  background-color: #67c23a;
  border-color: #67c23a;
}
.m-button--info {
  color: #fff;
  background-color: #909399;
  border-color: #909399;
}
.m-button--warning {
  color: #fff;
  background-color: #e6a23c;
  border-color: #e6a23c;
}
.m-button--danger {
  color: #fff;
  background-color: #f56c6c;
  border-color: #f56c6c;
}
.m-button--text {
  border-color: transparent;
  color: #409eff;
  background: transparent;
  padding-left: 0;
  padding-right: 0;
}
// 圆角
.is-round{
  border-radius: 20px;
}

# 四、Button 组件里建一个 index.js 文件,用来把写的组件暴露出去

import mButton from './src/button.vue';
 
mButton.install = (Vue) => {
  Vue.component(mButton.name,mButton)
}
 
export default mButton;

# 五、packages 文件夹下新建 index.js 文件,用来管理所有的组件

import mButton from "./components/Button";
import mRow from "./components/Row";
import mCol from "./components/Col";
import mInput from "./components/Input";
 
// 组件列表
const components = [
  mButton,
  mRow,
  mCol,
  mInput
]
 
// 定义 install 方法,接收 Vue 作为参数。如果使用 use 注册插件,那么所有的组件都会被注册
const install = (Vue) => {
  // 判断是否安装
  if (install.installed) return
  // 遍历注册全局组件
  components.map(component => Vue.component(component.name, component))
}
 
if (typeof window !== 'undefined' && window.Vue) {
  install(window.Vue);
}
 
export default {
  install,
  mButton,
  mRow,
  mCol,
  mInput
}

# 组件引入

# 一、在 examples 的 main.js 中引入

import { createApp } from 'vue'
import App from './App.vue'
import './assets/css/reset.css'
import router from './router'
 
import mBaseUI from '../packages/index'
 
const app = createApp(App)
app.use(router)
app.use(mBaseUI)
app.mount('#app')

# 二、在 examples 的组件中使用

<template>
  <div>
    <m-button>默认按钮</m-button>
    <m-button type="primary">主要按钮</m-button>
    <m-button type="success">成功按钮</m-button>
    <m-button type="danger">危险按钮</m-button>
    <m-button type="info">信息按钮</m-button>
    <m-button type="warning">警告按钮</m-button>
    <m-button type="text">文本按钮</m-button>
  </div>
</template>

进入页面,可以看到已经成功了

img

# 上传 npm

# 一、配置 package.json

"scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "lib": "vue-cli-service build  --target lib --name m-baseui --dest lib packages/index.js"
  },

# 二、执行 npm run lib 进行打包

打包后,项目会多出一个 lib 文件夹

img

在 package.json 中添加发布的一些信息

img

描述:

description:描述信息

main:入口

keywords:关键词

npm 发布时,要将 package.json 中的 private 属性值改为 false

# 三、把不需要上传的文件加入到.gitignore 进行忽略

.gitignore 设置的忽略文件,在 git 代码管理和 npm publish 都会被忽略

examples/

# 四、README.md 中写使用说明

# m-baseui
 
## 安装
使用npm 或 yarn 安装
 
```
npm install m-baseui
yarn add m-baseui
```
 
## 引入 m-baseui
### 完整引入
#### 需要注意的是 css 样式文件需要单独引入。
在 main.js 中写入以下内容:
```js
import { createApp } from 'vue'
import App from './App.vue'
// 导入组件库
import mBaseui from 'm-baseui'
import 'm-baseui/lib/m-baseui.css';
 
const app = createApp(App)
app.use(mBaseui)
app.mount('#app')
```
<br/>
 
## 愉快开始
 
#### 至此 m-baseui 就引入完成并且可以使用了。
 
```html
<!-- html -->
<m-button>默认按钮</m-button>
<m-button type="primary">主要按钮</m-button>
```
 
<br/>

# 五、发布 npm

执行 npm login 命令,输入用户名和密码,输入密码时是看不到的

之后提示输入 email,成功后你的邮箱会收到一个 one-time password,填入这个一次性密码

登录之后,执行 npm publish 进行发布(每次进行发布的时候记得改下版本号)

发布成功后,到 npm 上,查看头像 ---->packages,就可以看到发布的包了

# 其他项目中使用

img

至此,大体就算完成了,后面就是完善每个组件。