手把手教你制作一个Vue项目的npm工具包

753 阅读2分钟

前言

随着项目越来越大,很多的工具类,或者一些公共组件,需要抽离出来,减少代码量,让开发者更多的关注业务代码。当然优化有很多种,这里演示的是制作一个npm包,也是一种较简单方法。

为何抽离,哪些需要抽离?

为何抽离,哪些需要抽离?其实并不是所有的工具类都抽离才是最好的,抽离的前提就是那个工具定下来是,始终不会变的,改变的也只是一些少量的参数。还有就是公共组件也是。不能反其道而行,做了反而实际开发中,更加麻烦。自己也演示的是项目中可能会用到的接口签名工具类。

项目初始化

npm init --y 并且修改package.json文件

{
  "name": "signature-tool",
  "version": "1.0.0",
  "description": "",
+ "main": "lib/signature-tool.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
+   "lib": "cross-env NODE_ENV=production webpack --progress --hide-modules"
  },
+ "repository": {
+  "type": "git",
+   "url": "https://github.com/forestxieCode/signature-tool"
+ },
+  "keywords": [
+  "signature-tool",
+   "signature"
+  ],
  "author": "",
  "license": "ISC"
}

安装需要的npm包npm install babel-core babel-loader babel-preset-stage-3 cross-env webpack-dev-server --save-dev

  "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",
    "webpack": "^3.6.0",
    "webpack-dev-server": "^2.9.1"
  }

新建一个webpack.config.js配置文件

var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: "./main/index.js",  // 入口文件地址
  output: {  // 配置出口文件,并且设置umd文件引入
    path: path.resolve(__dirname, "./lib"), 
    publicPath: "/lib/" ,   
    filename: "signature-tool.js" ,
    library: "signature-tool" ,
    libraryTarget: "umd" ,
    umdNamedDefine: true ,
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      }
    ]
  },
  resolve: {
    extensions: ['*', '.js', '.json']
  },
  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
    })
  ])
}

新增.babelrc,.npmignore文件,以及main,和lib文件夹

.babelrc 文件

{
  "presets": [
    ["env", { "modules": false }],
    "stage-3"
  ]
}

.npmignore 文件

# 忽略目录
node_modules/
packages/

目录文件

初始化工作就完成拉

工具类的编写

再main文件夹下新增一个index.js 文件

import SignatureTools from './src/index.js'

let signatureTool = ''     // 定义变量获取实体

const install = function (Vue, options){
    signatureTool =  new SignatureTools(options)
    Vue.prototype.$signatureTool = signatureTool   // Vue的use规范
}

export {
    install,
    signatureTool
}

main/src/index.js

import tools from './utils/tools.js'

let options = {
    secret: '', // 加密签名
    axios:''
}

function SignatureTools(opt){
    Object.assign(options, opt)
}

SignatureTools.prototype = {
    // 添加签名
    addSignature:function(request){
        request.headers.Signature = tools.formatSignature({           
            Query: tools.getQuery(request),
            secret: options.secret            
        })
        return request
    }
}
export default SignatureTools

main/src/utils/tools.js 工具类的实现,这省略一些代码。


function parseQueryToString(params) {
    const result = Object.keys(params)
      .map(k =>
        k + '=' + params[k]
      )
      .join('&')
    return result
}

export default {
    // 获取Query的数据
    getQuery:function (request) {
        let result = {}
        let href = ''
        if (request.url.indexOf('?') > -1) {
            href = request.url.slice(request.url.indexOf('?'))
        }
        new URLSearchParams(href).forEach((v, k) => result[k] = v);
        if (request.params) {
            result = Object.assign((request.params.params ? request.params.params : request.params), result)
        }
        return result;
    },
    // 签名数据格式化
    formatSignature:function (obj) {
        ----
        ----
        ---
    }
}

Over编写完逻辑代码,最后执行npm run lib 生成lib文件,之后就可以发布到npm拉。

npm发包步骤

  1. www.npmjs.com/ 注册一个npm账号
  2. 在项目更目录下npm login
  3. 输入注册的邮箱和密码
  4. 执行npm publish
  5. over

总结

其实你也很牛逼!!! ,觉得可以给个star哈..........