使用npm管理weex组件及公共模块库

随着公司终端多个项目切换到weex开发方案,这些项目中一些公共模块和组件都需要进行统一管理,以前直接使用源代码复制存在着许多缺陷,比如公共库中源代码修改困难、import路径需要多次修改、调用时每次都需要注册组件等多个问题。本文主要是研究通过npm来管理项目中vue.js的组件以及一些常用的公共方法,简化项目开发一些工作。

在Github上创建模块代码仓库

首先在github上创建公共模块库,如下图:

1

将创建好的github克隆下来,使用weexpack来创建一个weex项目。如果没有安装weexpack,先使用npm install -g weexpack --registry=https://registry.npm.taobao.org命令进行安装。

2

将生成的代码复制到git目录中,在项目目录中运行npm install安装依赖。安装完依赖后项目目录如下:

 BRWeexComponents
  ├── README.md
  ├── android.config.json
  ├── config.xml
  ├── node_modules
  ├── hooks
  │   └── README.md
  ├── ios.config.json
  ├── package.json
  ├── platforms     // 平台模版目录
  ├── plugins       // 插件下载目录
  │   └── README.md
  ├── src           // 业务代码(vue文件)目录
  │   └── index.vue
  ├── start
  ├── start.bat
  ├── tools
  │   └── webpack.config.plugin.js
  ├── web
  │   ├── index.html
  │   ├── index.js
  │   └── js
  │       └── init.js
  └── webpack.config.js

如果要使用原生项目,可以运行weexpack platform add ios或者weexpack platform add android来添加对应的平台支持。

关于weexpack更多内容可以参考weexpack说明

添加需要发布的模块

我们在项目中添加我们将要发布的模块,包括组件、指令、混合以及公共方法等内容,代码目录如下:

3

我们首先在项目中新建一个简单的组件v-base-button,在components中新建一个v-base-button.vue文件,内容如下:

<template>
    <div class="base-button" v-on:click="clickAction"></div>
</template>

<script>
    export default {
        data: {
        },
        methods: {
            clickAction:function () {
                console.log("====被点击了")
            }
        }
    }
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
    .base-button {
        display: block;
        background: red;
        width: 100px;
        height: 100px;
    }
</style>

再在utils目录中导入以前常用的一些js模块,比如项目所使用的DateUtil.js,然后需要在modules-index.js入口文件进行导入。index.js中间主要是包含一个Vue.js插件,插件更详细的用法可以参考Vue.js插件文档说明index.js的内容如下:

import DateUtil from './utils/DateUtil'

const components = {
    //将需要注入的组件在此处导入
    "v-base-button":require('./components/v-base-button.vue')
};

const utils = {
    //将公共库类统一放在此处管理
    DateUtil:DateUtil,
};

const install = function (Vue, opts = {}) {

    //自动注入所有导入components的组件
    Object.keys(components).forEach(key => {
        Vue.component(key, components[key]);
    });

    //将公共库类统一放入到Vue实例的$utils中,项目中可以通过this.$utils.DateUtil来进行调用
    Vue.prototype.$utils = utils;

    //也可以通过此方法来赋予全局变量,项目中可以通过使用Vue.brutils.DateUtil来进行调用
    Vue.brutils = utils;

};

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

let API = {
    version: '0.0.15',
    install,
    components:components,
    utils:utils
};

export default API;

注意: 在此处没有采用modules.exports方法导出,因为现在项目中统一采用es6的import方法,而不是requires方法, 模块中所有的模块导出必须采用export方式,否则会报错:
“Uncaught TypeError: Cannot assign to read only property 'exports' of object '#<Object>'”
更多关于export、exports、modules.exports 和 require 、import的用法可以参考《export、exports、modules.exports 和 require 、import 的一些组合套路和坑》

可以在src-index.vue中添加测试代码,测试我们模块中编写的插件是否可用:

<template>
  <div class="wrapper" @click="update">
    <image :src="logoUrl" class="logo"></image>
    <text class="title">Hello {{target}}</text>
    <text class="desc">Now, let's use vue to build your weex app.</text>
    <!--使用模块中注入的自定义组件-->
    <v-base-button></v-base-button>
  </div>
</template>

<style>
  .wrapper { align-items: center; margin-top: 120px; }
  .title { padding-top:40px; padding-bottom: 40px; font-size: 48px; }
  .logo { width: 360px; height: 156px; }
  .desc { padding-top: 20px; color:#888; font-size: 24px;}
</style>

<script>

  import Vue from "vue"
  import brmodules from './modules/index'

  //使用模块中编写的插件
  Vue.use(brmodules);

  export default {
    data: function() {
        return {
            logoUrl: 'http://img1.vued.vanthink.cn/vued08aa73a9ab65dcbd360ec54659ada97c.png',
            target: 'World'
        }
    },
    created: function() {
        console.log("=========Vue实例对象调用:" + this.$utils.DateUtil.format("yyyy-MM-dd hh:mm:ss", new Date()));
        console.log("=========Vue全局对象调用:" + Vue.brutils.DateUtil.format("yyyy-MM-dd hh:mm:ss", new Date()));
    },
    methods: {
      update: function (e) {
        this.target = 'Weex';
        console.log('target:', this.target)
      }
    }
  }
</script>

通过npm run serve运行项目,可以看到我们插入的红色方框已经显示在页面最下面,同时console也打印出我们模块中注入的全局对象和实例对象的调用log。

现在版本的weexpack生成的web-index.html中读取的生成的js路径有误,有时候运行npm run servenpm run build后,仍然无法显示,可以修改index.html中的var page = getUrlParam('page') || 'dist/index.js';修改成var page = getUrlParam('page') || '../dist/index.js';即可。

npm模块发布

通过weexpack创建的项目本身包含一个package.json文件,我们可以通过此文件将公共模块发布到npm仓库中去。

发布npm模块首先需要注册https://www.npmjs.com/账号,注册后在终端运行npm adduser进行登录,依次填入注册时的账号、密码以及邮箱。登录后也可以通过npm whoami查看当前账号。

继续修改package.json文件,添加模块的详细描述内容。

{
    "name": "brweexcomponents",
    "version": "0.0.1",
    "description": "博瑞终端组weex组件库、插件以及公共方法",
    "homepage": "https://github.com/brlf-gz/BRWeexComponents",
    "main": "src/modules/index.js",
    "files": [
        "src"
    ],
    "repository": {
        "type": "git",
        "url": "https://github.com/brlf-gz/BRWeexComponents.git"
    },
    "bugs": {
        "url": "https://github.com/brlf-gz/BRWeexComponents/issues"
    },
    "keywords": [
        "weex",
        "vue",
        "component"
    ],
    "author": "brlf",
    "license": "MIT",
    "dependencies": {
        "fs-extra": "^4.0.1",
        "vue": "^2.1.8",
        "vue-router": "^2.1.1",
        "vuex": "^2.1.1",
        "vuex-router-sync": "^4.0.1",
        "weex-html5": "^0.4.1",
        "weex-vue-render": "^0.11.2"
    },
    ......
}

注意: name不能包含大写,否则不能发布。
main:代表文件入口,这里面使用的是模块的入口文件, 也可以将编译后的dist赋值过去,不过需要修改webpack.config.js文件,这里不做介绍。
files:我们直接引用源代码,所以只包含src文件夹,如果使用dist的内容,需要包含dist文件夹。

修改完成后,将项目推送到github上。然后在项目文件中运行命令npm publish进行发布。
发布成功后可以会在底部显示模块信息:

+ brweexcomponents@0.0.1

使用npm模块

发布成功后,我们可以在其他项目中引入我们发布的模块。
在package.json中加入依赖文件:

"dependencies": {
    ......
    "brweexcomponents":"^0.0.1",
    ......
},

然后重新运行npm install即可引入我们的模块。

在项目入口中加入以下代码,将我们的插件注入:

import brmodules from 'brweexcomponents'
import Vue from 'vue'
Vue.use(brmodules);

然后即可在所有的文件中引用模块中的组件以及公共方法等内容。

有更多问题可以在我的简书或者博瑞立方终端组中进行留言交流。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过...
    阳阳阳一堆阳阅读 3,190评论 0 5
  • webpack 介绍 webpack 是什么 为什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert阅读 6,330评论 2 71
  • 《横向领导力》——罗杰·费希尔 该书教给大家在同等职位级别的情况下,如何影响同事,实现高效合作。当然这个理论同样适...
    米粥的江湖阅读 598评论 0 0
  • 打个哈欠准备睡觉了,打算给手机充电然后睡觉 结果我顺手拿起我刚接的热水杯,就变成了这样 我觉得,我也需要充充电了。...
    眠花城阅读 214评论 0 0