weex+express+gulp开发文件搭建

开发环境搭建

快速入门

下载weex-toolkit

npm install -g weex-toolkit

编写一个简单的we文件如:

<template>
  <container>
    <text style="font-size: {{size}}">{{title}}</text>
  </container>
</template>

<script>
  module.exports = {
    data: {
      size: 48,
      title: 'Alibaba Weex Team'
    }
  }
</script>

在浏览器中调试查看使用命令

weex codePath
  • 在手机中查看,需要下载weex playground这个程序,因为weex需要有一个能够解析其UI布局的容器,所以需要在安装有改解析容器的sdk,可以去weex的官网下载该playground,地址为:
    https://alibaba.github.io/weex/download.html
  • 然后运行命令
weex codePath --qr
  • 在playground里面扫描改二维码就可以看到效果了

在gulp中集成weex开发和部署工程

  • 使用gulp-weex模块
const gulp = require('gulp');
const weex = require('gulp-weex');

gulp.task('weex', ()=>{
    return gulp.src(codePath)
        .pipe(weex({}))
        .pipe(gulp.dest(outputPath));
});

gulp-weex编译生成的jsbuddle可以在web,android和ios上直接使用,但是需要使用一些手段来进行加载该jsbuddle

  • 在web上使用gulp-weex生成的jsbuddle,我们需要使用异步的方式来加载模块,一般我们直接使用weex codePath命令在浏览器上面预览的页面也是通过这种方式来进行预览的,所以我们可以借用里面的代码来直接预览我们使用gulp-weex生成的jsBuddle,首先我们直接将weex codePath生成的一些必要文件保存起来,如dist目录下的


    image
  • 在index.html中我们需要引入dist/weex.js或者dist/weex.min.js
    ==同时我们需要对flexible进行js的处理,以免在web上面和在安卓或者ios上面出现不一致的地方==
  • 最主要的是调用window.weex.init()方法,将我们的weex编译的jsbuddle进行调用
window.weex.init({
    appId: location.href,
    loader: loader,
    source: page,
    rootId: 'weex'
})
  1. appId是weex的实例id,可以为任何唯一的字符串或者是数字,用来表明weex实例;
  2. loader模块加载方式,默认为xhr,即异步的加载方式,也可以为jsonp,或者是sorce也就是直接将jsBuddle的编译码放在surce里面
  3. sorce:指定jsBuddle的位置
  4. rootId:weex的根目录id,默认为weex,即<div id="weex"></div>,也就会将生成的dom节点放在这个div里面

我们想要达到的效果是,可以输出一个页面的地址目录,然后点击每个目录可以有相应的weex页面可以显示出来,同时可以通过gulp进行批量出来,而不是需要使用weex codePath才能看到效果,而是可以通过我们自己起的服务来实现这个效果,这样就可以在我们的node项目里面一起启动了

我们使用3步来实现这个效果

  1. 使用gulp-weex对相应的weex文件编译成可以直接使用的jsbuddle这样在我们开发环境和生产环境就能保证文件的一致性
  2. 使用through2对生成的文件进行处理,取出路径和文件名,这个路径就是我们进入当前业务的加载模块的路径
  3. 按照上面得到的文件列表组装成相应的文件目录,得出我们最终要显示的文件列表页面

首先,我们会将我们的weex文件放在一个项目目录里面,然后使用gulp对这些文件进行处理,同时取出

  • 一般情况下我们会把一些打包参数的配置,放在一个json文件里面,现在创建一个配置的文件config.json
{
    "weex": {
        "views": "app/views/weex/",
        "mainHtml": "task/weexTemplate/",
        "transportJs": "app/public/weex/",
        "previewPath": "app/public/weexPreview/"
    }
}
  • 编写我们的打包脚本,先将我们的.we文件编译一下
const gulp = require('gulp');
const weex = require('gulp-weex');

/**
 * 只对每个业务的入口文件进行weex的编译
 */
gulp.task('weex', function () {
    return gulp.src(config.weex.views + '**/*.we')
        .pipe(weex({}))
        .pipe(gulp.dest(config.weex.transportJs));
});
  • 使用through2将we文件的标题和文件路径读取出来
const titleRegExp    = /<!--title: (.*)-->/;
const pathNameRegExp = /(.*)\.we/;
/**
 * 在浏览器上预览weex页面
 */
gulp.task('weex:ToJson', function () {
    return gulp.src(config.weex.views + '**/*.we')
        .pipe(through2.obj(function (file, encoding, callback) {
            if ( file.isNull() ) {
                return callback(null, file);
            }

            var html = file.contents.toString();

            if ( !html ) {
                return callback(null, file);
            }
            
            //取出页面标题
            var title = html.match(titleRegExp)[1];
            //取出页面地址
            var path  = file.relative;
            path      = path.match(pathNameRegExp)[1] + '.js';
            
            //页面地址放到内存数组中
            sourcemap.push({
                title: title,
                path: path
            });

            callback();
        }));
});
  • 然后按照上面的数组渲染出一个首页出来,这里使用nunjucks来对模板进行编译
html:
    <h2>Weex 页面</h2>
    <!--遍历输出页面路近-->
    <ul>
        {% for item in data %}
        <li><a href="/public/weexPreview/index.html?hot-reload_controller&page={{item.path}}&loader=xhr">{{item.title}}</a></li>
        {% endfor %}
    </ul>
    
gulpJS:
gulp.task('weex:dev', ['weex', 'weex:ToJson'], function () {
    return gulp.src(config.weex.mainHtml + 'main.html')
        .pipe(nunjucks.compile({ data: sourcemap }))
        .pipe(gulp.dest(config.weex.previewPath));
});
  • 可以发现我们的每一个weex页面其实都是同一个页面,只是请求的参数不一样,因为我们在这个页面上使用了异步的方式来加载所需要的weex模块代码
<div id="weex"></div>
<script src="/public/weexPreview/lib/weex.js"></script>
<script>
    (function () {
        function getUrlParam(key) {
            var reg   = new RegExp('[?|&]' + key + '=([^&]+)')
            var match = location.search.match(reg)
            return match && match[1]
        }

        var loader = 'xhr';
        var page   = '/public/weex/' + getUrlParam('page');

        window.weex.init({
            appId: location.href,
            loader: loader,
            source: page,
            rootId: 'weex'
        })
    })();
</script>
  • 最后我们使用nodemon来启动一个服务同时监听weex文件的变化,当发生变化时可以及时的更新文件,同时用gulp-open来打开页面
const nodemon = require('gulp-nodemon');
const open = require('gulp-open');

gulp.task('open:weex', function () {
    return gulp.src('')
        .pipe(open({ uri: 'http://localhost:9080/public/weexPreview/main.html' }));
});

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

推荐阅读更多精彩内容

  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等等一些原本后端的思想开始...
    Charlot阅读 5,439评论 1 32
  • 前言 本文默认你已经安装好node环境,并且熟悉node命令,和window cd命令。 gulp简介 基于nod...
    9I阅读 1,982评论 4 50
  • 对网站资源进行优化,并使用不同浏览器测试并不是网站设计过程中最有意思的部分,但是这个过程中的很多重复的任务能够使用...
    懵逼js阅读 1,067评论 0 8
  • gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学...
    依依玖玥阅读 3,152评论 7 55
  • gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学...
    build1024阅读 528评论 0 0