UNPKG

2.88 kBJavaScriptView Raw
1var debug = require('debug')('clam:assetsTool');
2var path = require('path');
3var parser = require('./dependParser').parser;
4var Map = require('./util/map');
5
6// 这行内容适合提取到配置文件中
7var SEP = ':', CSS = 'css', JS = 'js', HEAD = 'head', FOOT = 'foot';
8
9var exCss = /\.css/gi;
10function getType(content) {
11 return content.match(exCss) ? CSS : JS;
12}
13
14// DOM渲染器
15var renderer = {};
16renderer[CSS] = function (url, pos) {
17 var str = '<link type="text/css" rel="stylesheet" href="' + url + '" />';
18 //console.log(str); // TODO ...
19 return str;
20};
21renderer[JS] = function (url, pos) {
22 var str = '<script src="' + url + '" ></script>';
23 //console.log(str); // TODO ...
24 return str;
25};
26
27// $assetsTool API
28function AssetsTool() {
29 this.map = new Map();
30}
31AssetsTool.prototype.use = function (content) {
32 // css和js分离
33 var cssMod = [], jsMod = [];
34 var content = content || '';
35
36 content.split(',').forEach(function(m) {
37 var type = getType(m);
38 type == CSS ? cssMod.push(m): jsMod.push(m);
39 });
40
41 var urls = parser.getComboUrls(cssMod).concat(parser.getComboUrls(jsMod)),
42 type, ret = '';
43
44 if (typeof urls == 'string') urls = new Array(urls);
45
46 for (var i = 0, l = urls.length; i < l; i++) {
47 type = getType(urls[i]);
48 ret += renderer[type](urls[i]);
49 }
50 return ret;
51};
52AssetsTool.prototype.require = function (content, pos) {
53 var self = this;
54 content.split(',').forEach(function(m) {
55 var type = getType(m);
56
57 var mods = parser.getMods(m);
58
59 // 默认css放到头部,js放到底部
60 if (!pos) var pos = (type == CSS) ? HEAD : FOOT;
61
62 self.map.put(type + SEP + (pos || HEAD), mods);
63 });
64};
65AssetsTool.prototype.injectStyle = function () {
66 return this._inject(CSS, HEAD);
67};
68AssetsTool.prototype.injectScript = function (pos) {
69 return this._inject(JS, pos);
70};
71AssetsTool.prototype._inject = function (type, pos) {
72 var mods = this.map.get(type + SEP + pos),
73 urls = parser.getComboUrls(mods), ret = '';
74 for (var i = 0, l = urls.length; i < l; i++) {
75 ret += renderer[type](urls[i]);
76 }
77 return ret;
78};
79function feLoader(data) {
80 var cmd = [];
81 data.forEach(function(i){
82 cmd.push('{express:' + i['express'] + ', id:"'+ i['id'] + '"}');
83 })
84
85 cmd = 'var data = [' + cmd.join(',') + '], ret = [];'
86 + 'for (var i = 0, str; i < data.length; i++) {'
87 + ' str = data[i]["express"];'
88 + ' if (str) {'
89 + ' ret.push({'
90 + ' express: str,'
91 + ' id: data[i]["id"]'
92 + ' });'
93 + ' }'
94 + '}'
95 + 'return ret;';
96
97 var fn = new Function('$assetsTool', cmd);
98 return fn(new AssetsTool());
99}
100exports.feLoader = feLoader;
101
102exports.clearCacheMod = parser.clear;