UNPKG

@tarojs/mini-runner

Version:

Mini app runner for taro

63 lines 2.98 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const loader_utils_1 = require("loader-utils"); const sax = require("sax"); function miniTemplateLoader(source) { this.cacheable && this.cacheable(); /** * 两种fix方案: * 1. 用任意xml标签包裹source,使之变成较标准的xml格式(含有一个根节点) * 2. 修改 sax.parser 的第一个参数为 true,启用严格模式 * 2.1 该模式下小程序模板中的标签或属性不会处理(例如写入<Import SrC="..." />不会处理成<import src="..." />,而是保持原样 * 2.2 该模式将认为传入的xml为非标准的,无需标准化,且不按照以根节点模式处理,因此可以正常解析小程序模板 * * 推荐方案1,这样在构建时会正常打入需要的包,但是若用户有 SrC 类似的写法导致引用失败,则可直接修正,不会认为是打包出现了问题 **/ const sourceWithRoot = `<root>${source}</root>`; const parser = sax.parser(false, { lowercase: true }); const requests = new Set(); const callback = this.async(); const loadModule = request => new Promise((resolve, reject) => { this.addDependency(request); this.loadModule(request, (err, src) => { if (err) { reject(err); } else { resolve(src); } }); }); parser.onattribute = ({ name, value }) => { if (value && name === 'src' && (0, loader_utils_1.isUrlRequest)(value)) { const request = (0, loader_utils_1.urlToRequest)(value); requests.add(request); } }; parser.onend = () => __awaiter(this, void 0, void 0, function* () { try { const requestsArray = Array.from(requests); if (requestsArray.length) { for (let i = 0; i < requestsArray.length; i++) { yield loadModule(requestsArray[i]); } } callback(null, source); } catch (error) { callback(error, source); } }); parser.write(sourceWithRoot).close(); } exports.default = miniTemplateLoader; //# sourceMappingURL=miniTemplateLoader.js.map