gulp、MockJs、NodeJs、Mustache脱离后台环境,只通过模拟数据运行项目

项目需求:在node环境下开发的项目,发布后不依靠后台数据,只通过模拟数据能正常运行(做项目demo);
用到的主要技术:gulp(构建工具),MockJs(模拟数据),NodeJs(文件读写流),Mustache(拿到数据后页面渲染);
开发中遇到的问题说明:模拟数据采用MockJs,之前的思路是将数据用json文件的形式写成,然后用Mock拦截url返回从json文件中读取出数据作为template返回,就是上一篇文章中的形式,但这样写就存在着无法根据参数返回数据,参数基本都用不上了,这种方式生成的MockData.js文件如下:
这里写图片描述
为了能根据参数返回不同的结果,因此将模拟数据文件用js文件写成,也就是将Mock函数url对应的结果用function函数来解析参数,并根据参数返回,生成的MockData.js文件结构如下:
这里写图片描述

1、创建一个gulp项目(之前的博客中有写到,不懂的可以往前翻阅),命名为gulpDemo;

项目结构入下:
这里写图片描述

2、创建page2.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/css/page2.css">
</head>
<body>
<div class="tableBox">
    <h2>电站信息</h2>
    <table id="plantMsg" cellspacing="0">
        <thead>
            <tr>
                <th>电站状态</th>
                <th>电站名称</th>
                <th>电站地址</th>
                <th>联系人</th>
                <th>联系电话</th>
                <th>装机容量(kW)</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>
</div>
<script type="text/javascript" src="/js/require.js" data-main="/js/partial/page2.js" defer async></script>
</body>
</html>
3、创建page2.less

.tableBox{
  table{
    width: 50%;

    border-top: 1px solid #ccc;
    border-left: 1px solid #ccc;
    th{
      width: 10%;
      text-align: center;
      border-right: 1px solid #ccc;
      border-bottom: 1px solid #ccc;
    }
    td{
      text-align: center;
      border-right: 1px solid #ccc;
      border-bottom: 1px solid #ccc;
    }
  }
}
4、创建page2.js
/**
 * Created by p00422 on 2017/6/21.
 */
require.config({
    paths: {
        'jquery': '../plugin/jquery.min',
        'mustache': '../plugin/mustache.min',
        'MockData': '../plugin/mockData/MockData'
    }
})
// 使用 Mock
require(["jquery"],function($){
    require(['mustache','MockData'],function(Mustache){
        var params = {
            type:2
        }
        $.ajax({
            url:'/tableData/plantMsg',
            method:'post',
            dataType:'json',
            mockData:false,
            data:JSON.stringify(params),
            success:function(data){
                var result = {
                    plantMsg:data
                };
                console.log(result);

                var template = '{{#plantMsg}}<tr><td>{{status}}</td><td>{{name}}</td><td>{{addr}}</td>' +
                    '<td>{{contact}}</td><td>{{contactPhone}}</td><td>{{capacity}}</td></tr>{{/plantMsg}}';

                var appendHtml = Mustache.render(template,result);
                console.log(appendHtml);
                $('#plantMsg tbody').html(appendHtml);
            },
            error:function(e){
                console.log(e);
            }
        })


    });

// 输出结果

})();
5、创建gulpfile.js
/**
 * Created by p00422 on 2017/6/21.
 */
var gulp = require('gulp'),
    plugins = require("gulp-load-plugins")({
        pattern: '*' //让gulp-load-plugins插件能匹配除了gulp插件之外的其他插件
    }),
    path = {
        html: 'html/**/*.html',
        htmlDir: 'dest/',
        css: 'css/*.css',
        cssDir: 'dest/css',
        less: 'less/*.less',
        js: 'js/**/*.js',
        jsDir: 'dest/js',
        images: 'images/*.+(jpg|png|gif|svg)',
        imagesDir: 'dest/images'
    },
    isMock = true;


//压缩css,压缩后的文件放入dest/css
gulp.task('minifycss', function () {
    return gulp.src(path.css)
        .pipe(plugins.cssmin()) //压缩
        .pipe(gulp.dest(path.cssDir));//输出
});

//合并并压缩css,合并压缩后的文件放入dest/css
gulp.task('concatminifycss', function () {
    return gulp.src(path.css)
        .pipe(plugins.concat('main.css'))    //合并所有css到main.css
        //.pipe(gulp.dest(path.cssDir))    //输出main.css到文件夹
        //.pipe(plugins.rename({suffix: '.min'}))   //rename压缩后的文件名
        .pipe(plugins.cssmin())//压缩
        .pipe(gulp.dest(path.cssDir));//输出
});

//压缩js,压缩后的文件放入dest/js
gulp.task('minifyjs', function () {
    return gulp.src(path.js)
        .pipe(plugins.uglify())//压缩
        .pipe(gulp.dest(path.jsDir));//输出
});

//合并并压缩js,合并压缩后的文件放入dest/js
gulp.task('concatminifyjs', function () {
    return gulp.src(path.js)
        .pipe(plugins.concat('main.js'))    //合并所有js到main.js
        .pipe(gulp.dest(path.jsDir))    //输出main.js到文件夹
        .pipe(plugins.rename({suffix: '.min'}))   //rename压缩后的文件名
        .pipe(plugins.uglify())//压缩
        .pipe(gulp.dest(path.jsDir));//输出
});
//合并并压缩html,合并压缩后的文件放入dest/
gulp.task('html', function () {
    gulp.src(path.html)
        .pipe(plugins.replace('__VERSION', Date.now().toString(16)))
        .pipe(plugins.htmlmin({
            removeComments: true,//清除HTML注释
            collapseWhitespace: true,//压缩HTML
            collapseBooleanAttributes: true,//省略布尔属性的值 <input checked="true"/> ==> <input />
            removeEmptyAttributes: true,//删除所有空格作属性值 <input id="" /> ==> <input />
            removeScriptTypeAttributes: true,//删除<script>的type="text/javascript"
            removeStyleLinkTypeAttributes: true,//删除<style>和<link>的type="text/css"
            minifyJS: true,//压缩页面JS
            minifyCSS: true//压缩页面CSS
        }))
        .pipe(gulp.dest(path.htmlDir))
        .pipe(plugins.browserSync.stream());
});
//压缩图片,压缩后的文件放入dest/images
gulp.task('image', function () {
    gulp.src(path.images)
        .pipe(plugins.imagemin({
            optimizationLevel: 5, //类型:Number  默认:3  取值范围:0-7(优化等级)
            progressive: true, //类型:Boolean 默认:false 无损压缩jpg图片
            interlaced: true, //类型:Boolean 默认:false 隔行扫描gif进行渲染
            multipass: true //类型:Boolean 默认:false 多次优化svg直到完全优化
        }))
        .pipe(gulp.dest(path.imagesDir));//输出
});

//执行压缩前,先删除dest文件夹里的内容
gulp.task('clean', function (cb) {
    plugins.del(['dest/*'], cb)
});

//编译less到css
gulp.task("less", function () {
    gulp.src(path.less)
        .pipe(plugins.less())
        .pipe(gulp.dest(path.cssDir));

});
//监视文件的变化
gulp.task("watch", function () {
    gulp.watch(path.less, ['less']);
    gulp.watch(path.css, ['concatminifycss']);
    gulp.watch(path.html, ['html']);
    gulp.watch(path.js, ['minifyjs']);
    gulp.watch(path.images, ['image']);
});
gulp.task("build", ["clean"], function (cb) {
    plugins.runSequence(['concatminifycss', 'image', 'less', 'minifyjs', 'html', 'MockData', "watch"], cb);
});
//MockData
gulp.task('MockData',function(){
    function extend() {
        var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {},
            i = 1,
            length = arguments.length,
            deep = false,
            toString = Object.prototype.toString,
            hasOwn = Object.prototype.hasOwnProperty,
            push = Array.prototype.push,
            slice = Array.prototype.slice,
            trim = String.prototype.trim,
            indexOf = Array.prototype.indexOf,
            class2type = {
                "[object Boolean]": "boolean",
                "[object Number]": "number",
                "[object String]": "string",
                "[object Function]": "function",
                "[object Array]": "array",
                "[object Date]": "date",
                "[object RegExp]": "regexp",
                "[object Object]": "object"
            },
            jQuery = {
                isFunction: function (obj) {
                    return jQuery.type(obj) === "function"
                },
                isArray: Array.isArray ||
                function (obj) {
                    return jQuery.type(obj) === "array"
                },
                isWindow: function (obj) {
                    return obj != null && obj == obj.window
                },
                isNumeric: function (obj) {
                    return !isNaN(parseFloat(obj)) && isFinite(obj)
                },
                type: function (obj) {
                    return obj == null ? String(obj) : class2type[toString.call(obj)] || "object"
                },
                isPlainObject: function (obj) {
                    if (!obj || jQuery.type(obj) !== "object" || obj.nodeType) {
                        return false
                    }
                    try {
                        if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
                            return false
                        }
                    } catch (e) {
                        return false
                    }
                    var key;
                    for (key in obj) {}
                    return key === undefined || hasOwn.call(obj, key)
                }
            };
        if (typeof target === "boolean") {
            deep = target;
            target = arguments[1] || {};
            i = 2;
        }
        if (typeof target !== "object" && !jQuery.isFunction(target)) {
            target = {}
        }
        if (length === i) {
            target = this;
            --i;
        }
        for (i; i < length; i++) {
            if ((options = arguments[i]) != null) {
                for (name in options) {
                    src = target[name];
                    copy = options[name];
                    if (target === copy) {
                        continue
                    }
                    if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {
                        if (copyIsArray) {
                            copyIsArray = false;
                            clone = src && jQuery.isArray(src) ? src : []
                        } else {
                            clone = src && jQuery.isPlainObject(src) ? src : {};
                        }
                        // WARNING: RECURSION
                        target[name] = extend(deep, clone, copy);
                    } else if (copy !== undefined) {
                        target[name] = copy;
                    }
                }
            }
        }
        return target;
    }

    var fs = require('fs');
    var baseUrl = 'dataJs';
    var mockJsFile = './js/plugin/mockData/MockData.js';
    var fileReadStream;
    var files;
    var appendData='';

    //获取目录下的左右文档
    if(fs.existsSync(baseUrl)){
        files = fs.readdirSync(baseUrl);
        createStreamFile();
    }else {
        console.log(baseUrl + "  Not Found!");
    }

    fs.writeFileSync(mockJsFile,'define(\'MockData\', [\'../plugin/mock-min\'], function (Mock) {\n','utf8'); //同步写入
    function createStreamFile(){
        if(!(files.length)){
            console.log('copy end!');
            fs.appendFileSync(mockJsFile,'\n});','utf8');
            return;
        }
        var chunks = [];
        var size = 0;
        var _thisFile = files.shift();
        var objName = _thisFile.replace('.js','');
        console.log(_thisFile);
        //console.log(_thisFile);
        var currenFile = baseUrl + '/' + _thisFile;
        fileReadStream = fs.createReadStream(currenFile, {highWaterMark:64 * 1024})
        fileReadStream.setEncoding('UTF-8');

        fileReadStream.on('data', (chunk) => {
            if(typeof chunk != 'Buffer'){
                chunk = new Buffer(chunk);
            }
            chunks.push(chunk)
            size +=chunk.length;
        })

        fileReadStream.on('end', () => {
            if(chunks.length){
                var wholeData = Buffer.concat(chunks,size);
                //extend(middleware,eval(wholeData.toString()));
                eval(wholeData.toString());
                //console.log(eval(objName));
                var middleware = eval(objName);
                //middleware();
                //console.log(objName);
               /* var stringObj = JSON.stringify(wholeData.toString());
                var obj = JSON.parse(stringObj);*/
                for(var item in middleware){
                    appendData = 'Mock.mock("/'+_thisFile.replace('.js','')+'/'+item+'",'+middleware[item]+');\n';
                    fs.appendFileSync(mockJsFile,appendData,'utf8');
                }

                //fs.appendFileSync(mockJsFile,wholeData+'\n','utf8');
            }else {
                console.log('文件为空!');
            }
            createStreamFile()
        })
    }
});
//同步刷新
gulp.task("serve", ["build"], function () {
    plugins.browserSync({
        //files: '/build/**', //监听整个项目
        open: 'local', // 'external' 打开外部URL, 'local' 打开本地主机URL
//        https: true,
        port: 80,
        online: false,
        notify: false,
        logLevel: "info",
        logPrefix: "test",
        logConnections: true, //日志中记录连接
        logFileChanges: true, //日志信息有关更改的文件
        scrollProportionally: false, //视口同步到顶部位置
        ghostMode: {
            clicks: false,
            forms: false,
            scroll: false
        },
        server: {
            baseDir: './dest'
            //middleware: middleware
        }
    });

});

//默认命令,在cmd中输入gulp后,执行的就是这个命令
gulp.task('default', ['serve']);
6、创建模拟数据文件

kpiData.js

var kpiData = {
  plantMsg:function(params){
    var templateA = [
      {
        "status":"正常",
        "name":"龙岗电站",
        "addr":"安微",
        "contact":"张全蛋",
        "contactPhone":"13548691285",
        "capacity":"100"
      },{
        "status":"断连",
        "name":"小河电站",
        "addr":"安微",
        "contact":"张全蛋",
        "contactPhone":"13548691285",
        "capacity":"100"
      }];
    var templateS = [
      {
        "status":"正常",
        "name":"安正电站",
        "addr":"泗县",
        "contact":"张全蛋",
        "contactPhone":"13548691285",
        "capacity":"100"
      },{
        "status":"断连",
        "name":"神山口电站",
        "addr":"泗县",
        "contact":"张全蛋",
        "contactPhone":"13548691285",
        "capacity":"100"
      }];
    params && params.body && params.body.type && defaultFunc(params.body.type);
    function defaultFunc(param){
      switch (param){
        case 1:
          return templateA;
          break;
        case 3:
          return templateS;
          break;
        default:
              return templateS;
      }
    }
    return templateS;
  },
  curveMsg:function(params){
    var templateA = [
      {
        "status":"正常",
        "name":"龙岗电站",
        "addr":"安微",
        "contact":"张全蛋",
        "contactPhone":"13548691285",
        "capacity":"100"
      },{
        "status":"断连",
        "name":"小河电站",
        "addr":"安微",
        "contact":"张全蛋",
        "contactPhone":"13548691285",
        "capacity":"100"
      }];
    var templateS = [
      {
        "status":"正常",
        "name":"安正电站",
        "addr":"泗县",
        "contact":"张全蛋",
        "contactPhone":"13548691285",
        "capacity":"100"
      },{
        "status":"断连",
        "name":"神山口电站",
        "addr":"泗县",
        "contact":"张全蛋",
        "contactPhone":"13548691285",
        "capacity":"100"
      }];
    params && params.body && params.body.type && defaultFunc(params.body.type);
    function defaultFunc(param){
      switch (param){
        case 1:
          return templateA;
          break;
        case 3:
          return templateS;
          break;
        default:
          return templateS;
      }
    }
    return templateS;
  }
};

tableData.js

var tableData = {
  plantMsg:function(params){
    console.log(params);
    var templateA = [
      {
        "status":"正常",
        "name":"龙岗电站",
        "addr":"安微",
        "contact":"张全蛋",
        "contactPhone":"13548691285",
        "capacity":"100"
      },{
        "status":"断连",
        "name":"小河电站",
        "addr":"安微",
        "contact":"张全蛋",
        "contactPhone":"13548691285",
        "capacity":"100"
      }];
    var templateS = [
      {
        "status":"正常",
        "name":"安正电站",
        "addr":"泗县",
        "contact":"张全蛋",
        "contactPhone":"13548691285",
        "capacity":"100"
      },{
        "status":"断连",
        "name":"神山口电站",
        "addr":"泗县",
        "contact":"张全蛋",
        "contactPhone":"13548691285",
        "capacity":"100"
      }];
    params && params.body && params.body.type && defaultFunc(params.body.type);
    function defaultFunc(param) {
      switch (param) {
        case 1:
          return templateA;
          break;
        case 3:
          return templateS;
          break;
        default:
          return templateS;
      }
    }
    return templateS;
  }
};

页面运行结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值