Vue faz um pacote de npm de componente de brinde

Vue faz um pacote npm de componente ui

Eu escrevi um componente de interface do usuário antes, mas há muitas coisas desnecessárias, então eu o otimizei

Introdução

O pequeno componente que fiz antes foi construído com webpack-simple, mas acho que há muitas coisas desnecessárias, então escrevi uma versão limpa e abri diretamente.

Começar

Crie uma pasta vazia e execute o terminal diretamente npm init
após concluir o estabelecimento para gerar um package.jsonarquivo, como segue

Insira a descrição da imagem aqui
Observação: o nome é o nome do pacote npm a ser enviado posteriormente. Não repita o nome. Recomenda-se ir para npm para pesquisá-lo primeiro

Em seguida, package.jsonadicione o módulo de arquivos necessário,

{
    
    
  "name": "sever-ui",
  "version": "1.0.0",
  "description": "一个移动端ui小组件",
  "main": "index.js",
  "scripts": {
    
    
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack-dev-server --hot --inline",
    "build": "webpack --display-error-details --config webpack.config.js"
  },
  "author": "sever27",
  "license": "ISC",

  "devDependencies": {
    
    
        "babel-core": "^6.26.0",
        "babel-loader": "^7.1.2",
        "babel-plugin-transform-object-rest-spread": "^6.26.0",
        "babel-plugin-transform-runtime": "^6.23.0",
        "babel-polyfill": "^6.26.0",
        "babel-preset-es2015": "^6.24.1",
        "css-loader": "^0.28.7",
        "es6-promise": "^4.1.1",
        "vue": "^2.5.9",
        "vue-hot-reload-api": "^2.2.4",
        "vue-html-loader": "^1.2.4",
        "vue-style-loader": "^3.0.3",
        "vue-template-compiler": "^2.5.9",
        "webpack": "^3.9.1",
        "webpack-dev-server": "^2.9.5"
  }
}

Após a conclusão da modificação da configuração do terminal para executar npm installa instalação dependente.

Em seguida, crie uma pasta src e arquivos no diretório, esta é a minha estrutura de diretório
Insira a descrição da imagem aqui

Conteúdo do arquivo correspondente
src / main.vue

<template>
  <div v-if="visible" class="sever-toast">
      <span class="toast-msg" >{
    
    {
    
    msg}}</span>
  </div>
</template>
<script>
export default {
    
    
  name:"sever-toast",
  data(){
    
    
    return {
    
    
      visible:false,
      msg:'默认值',
      duration:'3000',
    }
  },
  methods:{
    
    
    close(){
    
    
      setTimeout(() => {
    
    
        this.visible = false;
      }, this.duration);

    }
  },
  mounted(){
    
    
  }
}
</script>
<style >
  .sever-toast{
    
    
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100%;
    position: fixed;
    top:0;
    bottom:0;
    left:0;
    right:0;
  }
  .toast-msg{
    
    
    color: #ffffff;
    background:rgba(0,0,0,0.5);
    padding:0.3rem;
    border-radius: 0.1rem;
    font-size: 0.34rem;
  }
</style>

src / main.js

import Vue from 'vue';
import Main from './main.vue'
let MmToast = Vue.extend(Main);

let instance ;

const Toast = function(options) {
    
    
  instance = new MmToast({
    
    
    data: options
  });
  instance.$mount();
  document.body.appendChild(instance.$el);
  instance.visible = true;

  return instance.close()
}

export default Toast

Toast / index.js

import Toast from './src/main.js'
export default Toast

index.js

import Toast from './Toast/index.js' 

const install = function(Vue) {
    
    

  Vue.prototype.$toast = Toast

}
console.log(typeof window !== 'undefined' , window.Vue)

if (typeof window !== 'undefined' && window.Vue) {
    
    
  install(window.Vue);
}

export default {
    
    
  install,
  Toast,
}

Em seguida, modifique webpack.dev.conf.js

const path = require("path");
const webpack = require("webpack");
const uglify = require("uglifyjs-webpack-plugin");

module.exports = {
    
    
    devtool: 'source-map',
    entry: "./src/index.js",//入口文件,src目录下的index.js文件,
    output: {
    
    
        path: path.resolve(__dirname, './dist'),//输出路径,就是新建的dist目录,
        publicPath: '/dist/',
        filename: 'sever-ui.min.js',
        libraryTarget: 'umd',
        umdNamedDefine: true
    },
    module: {
    
    
        rules: [{
    
    
                test: /\.vue$/,
                loader: 'vue-loader'
            },
            {
    
    
                test: /\.less$/,
                use: [
                    {
    
     loader: "style-loader" },
                    {
    
     loader: "css-loader" },
                    {
    
     loader: "less-loader" }
                ]
            },
            {
    
    
                test: /\.js$/,
                exclude: /node_modules|vue\/dist|vue-router\/|vue-loader\/|vue-hot-reload-api\//,
                loader: 'babel-loader'
            },
            {
    
    
                test: /\.(png|jpg|gif|ttf|svg|woff|eot)$/,
                loader: 'url-loader',
                query: {
    
    
                    limit: 30000,
                    name: '[name].[ext]?[hash]'
                }
            }
        ]
    },
    plugins: [
        new webpack.DefinePlugin({
    
    
            "process.env": {
    
    
                NODE_ENV: JSON.stringify("production")
            }
        })
    ]
}

Bem, um componente de notificação simples foi concluído
seguido pela implementação do npm run buildarquivo gerado pelo empacotamento
Insira a descrição da imagem aqui
e, em seguida, modifique o package.json

"main":"./dist/sever-ui.min.js",

Então, podemos fazer upload para o npm e
executar

npm login
npm publish

A seguir vamos ver o efeito

npm install sever-ui

Introduzir
Insira a descrição da imagem aqui

<template>
  <div class="home">
    <div @click="Toast()">点击Toast</div>
  </div>
</template>

<script>

export default {
    
    
  name: 'Home',
  components: {
    
    
  },
  methods:{
    
    
    Toast(){
    
    
      this.$toast({
    
    msg:'哈哈哈哈哈哈'})
    }
  }
}
</script>

Insira a descrição da imagem aqui

modificar

otimização

É apenas um brinde que parece inserir o conteúdo diretamente, então fiz algumas alterações em
main.js

import Vue from 'vue';
import Main from './main.vue'
let MmToast = Vue.extend(Main);

let instance ;

const Toast = function(options) {
    
    
  if( typeof options === 'string'){
    
    
    options = {
    
    
      msg:options
    }
  }
  instance = new MmToast({
    
    
    data: options
  });
  instance.$mount();
  document.body.appendChild(instance.$el);
  instance.visible = true;

  return instance.close()
}

export default Toast

Então você pode usá-lo diretamente this.$toast('toast内容')



Sou um peixe chucrute. Tenho ácido oleico. Vou trabalhar mais duro para aprender e compartilhar com você. Espero que você possa me apoiar e me elogiar muito.

Acho que você gosta

Origin blog.csdn.net/severzhao27/article/details/109315214
Recomendado
Clasificación