Coolie 2.5.0 加载 Vue 文件的思路及方案

发布于 2021-12-18 17:50:32 字数 4568 浏览 1115 评论 0

用 coolie 很多年了,非常感谢云大神提供这么好的工具,闲暇之余,对其稍作修改,支持构建 Vue 文件

一个 vue 文件包含 template, style, scrip 三个部分,本方案输出格式如下,构建前

<template>
	<div class="less-scoped">
        <p class="red">{{aaa}}</p>
    </div>
</template>

<script>
	exports.default = {
		data(){
			return {
				aaa : 123
			}
		}
	}
</script>

<style lang="less">
.less-scoped{
	.red{
		color : red;
	}
}
</style>

构建后,做了美化

/*coolie built*/
define("0", ["3"], function (e) {
    return e("3")
});
define("3", [], function (require, exports, module) {
    exports.render = function () {
        with(this) return _c("div", {
            staticClass: "index-user"
        }, [_c("p", {
            staticClass: "red"
        }, [_v(_s(aaa))])])
    };
    exports.staticRenderFns = [];
    exports.moduleid = "index-user";
    exports.style = ".index-user .red {\n  color: red;\n}\n";
    exports["default"] = {
        data: function () {
            return {
                aaa: 123
            }
        }
    }
});

如您所见,支持 es6,less 构建(没研究过官方的方案),然后自己再封装一个loadVue的方法,将上面的对象改成 vue 所需的格式即可

下面说下修改方案,coolie-cil

cnpm install coolie
cnpm install babel-cli
cnpm install babel-preset-es2015
cnpm install vue-template-compiler
cnpm install less

src/parse/require-pipeline.js

/**
 * 模块入口类型
 * @type {{}}
 */
var moduleInTypeMap = {
    js: 'js',
    vue: 'js',
    image: 'file',
    file: 'file',
    text: 'text',
    html: 'html',
    json: 'json',
    css: 'css'
};

src/utils/reader.js

var babel = require('babel-core');
var less = require('less');
var compiler = require('vue-template-compiler');

// 读取文件前加入
file = file.replace('.vue.js', '.vue');

// 读取文件后加入
bf = encoding === 'binary' ? bf : bf.toString(encoding);

var _ext = file.split('.');
var ext = _ext[_ext.length - 1];
if (ext == 'vue') {
    var nameArr = file.split('/');
    var _len = nameArr.length;
    var moduleid = nameArr[_len - 2] + '-' + nameArr[_len - 1];
    moduleid = moduleid.replace('.vue', '');

    var style = bf.match(new RegExp(/<style[^>]*?>([\s\S]+)<\/style>/)) || '';
    if (style && style[1].replace(/\s+/g, "")) {
        style = style[1].replace(/\"/g, "'")
            .replace(/less-scoped/, moduleid)
        // .replace(/\"/g, "'")
        // .replace(/\r\n/g, '\\' + 'n')
        // .replace(/\n/g, '\\' + 'n');
    } else {
        style = '';
    }

    var template = bf.match(new RegExp(/<template[^>]*?>([\s\S]+)<\/template>/))[1]
        .replace(/less-scoped/, moduleid)
    // .replace(/\"/g, '\\\"')
    // .replace(/\r\n/g, '\\' + 'n')
    // .replace(/\n/g, '\\' + 'n');

    var render = compiler.compile(template);
    var staticRenderFns = '[';
    render.staticRenderFns.forEach(function (item, index) {
        staticRenderFns += '(function() {' + item + '}),';
    })
    staticRenderFns += ']';

    var script = bf.match(new RegExp(/<script[^>]*?>([\s\S]+)<\/script>/))[1];
    script = babel.transform(script, {
        // extends : './.babelrc',
        // minified : true
        // presets : ['es2015']
        // presets: [['es2015', { loose: true, modules: false }]],
        presets: [[__dirname + '/../../babel-preset-es2015', { loose: true, modules: false }]],
    }).code;

    // var css = style.replace(/\"/g, "'")
    //     .replace(/\r\n/g, '\\' + 'n')
    //     .replace(/\n/g, '\\' + 'n');
    less.render(style, function (e, css) {
        css = css.css.replace(/\"/g, "'")
            .replace(/\r\n/g, '\\' + 'n')
            .replace(/\n/g, '\\' + 'n');

        bf = 'define(function(require, exports, module) {' + "\n"
            + '    exports.render = (function() {' + render.render + ";})\n"
            + '    exports.staticRenderFns = ' + (staticRenderFns) + ";\n"
            // + '    exports.template = "' + template + "\";\n"
            + '    exports.moduleid = "' + moduleid + "\";\n"
            + '    exports.style = "' + css + "\";\n"
            + script + "\n"
            + '})';
    });

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

贱贱哒

暂无简介

0 文章
0 评论
520 人气
更多

推荐作者

漫雪独思

文章 0 评论 0

垂暮老矣

文章 0 评论 0

鹊巢

文章 0 评论 0

萌酱

文章 0 评论 0

雨说

文章 0 评论 0

冰葑

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文