• vuejs 插件开发并发布到npm--(3)vue组件开发并发布


    一、以hyy-vshare插件开发为例

    1、初始化插件项目:vue init webpack-simple hyy-vshare,目录结构如下:

    2、添加依赖:npm i;

    3、启动服务:npm run dev;

    4、在src目录下新建lib文件夹,用于组件开发;

    5、开发并调试插件

    lib/index.js(全局组件的方式)

    import vshare from './vshare.vue' // 导入组件
    vshare.install = function (Vue) {
        Vue.component('vshare', vshare)
        if (typeof window !== 'undefined' && window.Vue) {
            window.Vue.use(vshare);
        }
    }
    export default vshare

    lib/vshare.vue

    <template>
    <div>
        <input type="text" v-model="vshareText">
        <div>
            你输入的是:{{vshareText}}
        </div>
    </div>
    </template>
    <script>
    export default {
        data() {
            return {
                vshareText: ""
            };
        }
    }
    </script>

    main.js

    import Vue from 'vue'
    import App from './App.vue'
    import vshare from './lib/index.js'
    Vue.use(vshare)
    new Vue({
      el: '#app',
      render: h => h(App)
    })

    App.vue

    <template>
      <div id="app">
        <vshare></vshare>
      </div>
    </template>
    
    <script>
    export default {
      name: 'app',
      data () {
        return {
          msg: 'Welcome to Your Vue.js App'
        }
      }
    }
    </script>
    
    <style>
    #app {
      font-family: 'Avenir', Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
    
    h1, h2 {
      font-weight: normal;
    }
    
    ul {
      list-style-type: none;
      padding: 0;
    }
    
    li {
      display: inline-block;
      margin: 0 10px;
    }
    
    a {
      color: #42b983;
    }
    </style>

    可以看到调试界面如下,是我们想要的结果:

    二、开发调试完成,进行插件打包

    1、修改 weppack.config.js 部分配置

    (1)入口文件;

    (2)打包后输出的文件名(非必选);

    (3)require时的模块名;

    (4)libraryTarget:libraryTarget会生成不同umd的代码,可以只是commonjs标准的,也可以是指amd标准的,也可以只是通过script标签引入的。

    (5)umdNamedDefine: 会对 UMD 的构建过程中的 AMD 模块进行命名。否则就使用匿名的 define。

    var path = require('path')
    var webpack = require('webpack')
    
    module.exports = {
      entry: './src/lib/index.js',
      output: {
        path: path.resolve(__dirname, './dist'),
        publicPath: '/dist/',
        filename: 'vshare.js',
        library: 'vshare',
        libraryTarget: 'umd',
        umdNamedDefine: true
      },
      module: {
        rules: [
          {
            test: /.css$/,
            use: [
              'vue-style-loader',
              'css-loader'
            ],
          },      {
            test: /.vue$/,
            loader: 'vue-loader',
            options: {
              loaders: {
              }
              // other vue-loader options go here
            }
          },
          {
            test: /.js$/,
            loader: 'babel-loader',
            exclude: /node_modules/
          },
          {
            test: /.(png|jpg|gif|svg)$/,
            loader: 'file-loader',
            options: {
              name: '[name].[ext]?[hash]'
            }
          }
        ]
      },
      resolve: {
        alias: {
          'vue$': 'vue/dist/vue.esm.js'
        },
        extensions: ['*', '.js', '.vue', '.json']
      },
      devServer: {
        historyApiFallback: true,
        noInfo: true,
        overlay: true
      },
      performance: {
        hints: false
      },
      devtool: '#eval-source-map'
    }
    
    if (process.env.NODE_ENV === 'production') {
      module.exports.devtool = '#source-map'
      // http://vue-loader.vuejs.org/en/workflow/production.html
      module.exports.plugins = (module.exports.plugins || []).concat([
        new webpack.DefinePlugin({
          'process.env': {
            NODE_ENV: '"production"'
          }
        }),
        new webpack.optimize.UglifyJsPlugin({
          sourceMap: true,
          compress: {
            warnings: false
          }
        }),
        new webpack.LoaderOptionsPlugin({
          minimize: true
        })
      ])
    }

    2、修改package.json文件

    (1)修改private: true为private: false;

    (2)添加 "main": "dist/vshare.js":这个超级重要 决定了你 import xxx from “vshare” 它默认就会去找 dist下的vshare 文件;

    (3)配置这个地址存放你项目在github上的位置(非必需)

    {
      "name": "hyy-vshare",
      "description": "A Vue.js project",
      "version": "1.0.0",
      "author": "TiffanyHYY <huyuanyuan123@t.shu.edu.cn>",
      "license": "MIT",
      "private": false,
      "main": "dist/vshare.js",
      "scripts": {
        "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
        "build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
      },
      "dependencies": {
        "vue": "^2.5.11"
      },
      "browserslist": [
        "> 1%",
        "last 2 versions",
        "not ie <= 8"
      ],
      "devDependencies": {
        "babel-core": "^6.26.0",
        "babel-loader": "^7.1.2",
        "babel-preset-env": "^1.6.0",
        "babel-preset-stage-3": "^6.24.1",
        "cross-env": "^5.0.5",
        "css-loader": "^0.28.7",
        "file-loader": "^1.1.4",
        "vue-loader": "^13.0.5",
        "vue-template-compiler": "^2.4.4",
        "webpack": "^3.6.0",
        "webpack-dev-server": "^2.9.1"
      }
    }

    3、执行npm run build,生成dist文件夹,里边包含了一个vshare.js和一个map文件

    4、本地测试打包后js文件

    (1)weppack.config.js的entry需要改回main.js

    (2)index.html

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <title>hyy-vshare</title>
      </head>
      <body>
        <div id="app"></div>
        <script src="/dist/vshare.js"></script>
      </body>
    </html>

    三、发布插件

    (1).npmignore:用于筛选不必要的文件(不必publish到npm的文件),真正有用的文件只有 dist/vshare.js文件和 package.json文件,readme.md文件用于描述该插件的使用方法,非必需。

    .*
    *.md
    *.yml
    build/
    node_modules/
    src/
    test/
    webpack.config.js
    .gitignore
    index.html
    .editorconfig
    .babelrc
    .package-lock.json
    dist/*.map

    (2)假设本地环境未执行过npm adduser,则先执行npm adduser;

    (3)如果本地环境已经执行过npm adduser,则直接执行npm publish;

    四、测试发布的后的生产包

    直接install下来,正常import进项目就可以使用啦!

  • 相关阅读:
    golang 使用错误总结
    golang 跨平台交叉编译
    golang redis 第三方包
    golang 浮点型 与其他数值类型计算
    golang 更友好的格式化输出
    golang 指定长度 随机数 & 随机字符串
    go语言中int和byte转换方式
    基础知识
    golang bytes 包 详解
    golang 解析 ini 文件 中文文档
  • 原文地址:https://www.cnblogs.com/TiffanyHYY/p/10364963.html
Copyright © 2020-2023  润新知