├── test
└── ut
│ ├── require.async
│ ├── src
│ │ ├── require.async.comment.a.js
│ │ ├── require.async.comment.b.js
│ │ ├── require.async.a.js
│ │ ├── require.async.js
│ │ └── require.async.comment.js
│ └── fis-conf.js
│ └── require.async.js
├── .npmignore
├── .gitignore
├── package.json
├── README.md
└── index.js
/test/ut/require.async/src/require.async.comment.a.js:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/test/ut/require.async/src/require.async.comment.b.js:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/test/ut/require.async/fis-conf.js:
--------------------------------------------------------------------------------
1 | fis.config.merge({
2 | namespace: "test"
3 | });
--------------------------------------------------------------------------------
/test/ut/require.async/src/require.async.a.js:
--------------------------------------------------------------------------------
1 | console.log("I'm require.async.a.js!");
--------------------------------------------------------------------------------
/test/ut/require.async/src/require.async.js:
--------------------------------------------------------------------------------
1 | require.async('./require.async.a.js');
--------------------------------------------------------------------------------
/test/ut/require.async/src/require.async.comment.js:
--------------------------------------------------------------------------------
1 | // @require.async ./require.async.comment.a.js
2 |
3 | /*
4 | * @require.async ./require.async.comment.b.js
5 | */
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | /.idea
2 | /.settings
3 | /.project
4 | /.gitignore
5 | /node_modules
6 | /test
7 | /.tmp
8 | /util
9 | /third
10 | /demo
11 | /build
12 |
13 |
14 | .DS_Store
15 |
16 | *.db
17 | *.bak
18 | *.tmp
19 | ~*
20 |
21 | upload.py
22 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /.idea
2 | lib-cov
3 | *.seed
4 | *.log
5 | *.csv
6 | *.dat
7 | *.out
8 | *.pid
9 | *.gz
10 | *.cmd
11 | tmp.*
12 |
13 | dev
14 | Makefile
15 | build
16 | third/*.bz2
17 | third/*.gz
18 |
19 | pids
20 | logs
21 | results
22 |
23 | npm-debug.log
24 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "fis-postprocessor-require-async",
3 | "version": "0.0.9",
4 | "description": "分析require.async的组件,并记录下来",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "https://github.com/xiangshouding/fis-postprocessor-require-async.git"
12 | },
13 | "keywords": [
14 | "fis"
15 | ],
16 | "author": "fis",
17 | "license": "MIT",
18 | "readmeFilename": "README.md",
19 | "gitHead": "63fe8d633b9234fed70acc950f06d9b9ddd1576d"
20 | }
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | fis-postprocessor-require-async
2 | =============================
3 |
4 | 分析使用了require.async执行的组件,并把它们记录下来
5 |
6 |
7 | help
8 | ----
9 |
10 | + install
11 |
12 | npm install -g fis-postprocessor-require-async
13 |
14 | + config
15 |
16 |
17 | vi fis-conf.js
18 |
19 | fis.config.merge({
20 | modules: {
21 | postprocessor: {
22 | js: 'require-async',
23 | tpl: 'require-async'
24 | ...
25 | }
26 | }
27 | ...
28 | });
29 |
--------------------------------------------------------------------------------
/test/ut/require.async.js:
--------------------------------------------------------------------------------
1 |
2 | "use strict"
3 |
4 | var fis = require('fis');
5 | //设置项目路劲
6 | fis.project.setProjectRoot(__dirname + '/require.async');
7 | var PROJECT_ROOT = fis.project.getProjectPath();
8 | //加载模块配置文件
9 | require(PROJECT_ROOT + '/fis-conf.js');
10 |
11 | var _ = fis.util;
12 | var file = fis.file;
13 |
14 | var expect = require('chai').expect;
15 | var _parser = require(__dirname + '/../../index.js');
16 |
17 |
18 |
19 | describe("require.async in a JavaScript file: ", function() {
20 | var f = file.wrap(PROJECT_ROOT + '/src/require.async.js');
21 | var res = _parser(f.getContent(), f, {});
22 |
23 | it('test content', function() {
24 | expect(res).to.equal("require.async('test:src/require.async.a.js');");
25 | });
26 |
27 | it ('test file.extras.async', function() {
28 | expect(f.extras).to.be.a('object');
29 | expect(f.extras.async).to.be.a('array');
30 | expect(f.extras.async).to.deep.equal(['test:src/require.async.a.js']);
31 | });
32 |
33 | });
34 |
35 | describe("require.async in comment: ", function() {
36 | var f = file.wrap(PROJECT_ROOT + '/src/require.async.comment.js');
37 | var res = _parser(f.getContent(), f, {});
38 |
39 | it ('test content', function() {
40 | expect(res).to.equal("// \n\n/*\n * \n */");
41 | });
42 |
43 | it ('test file.extras.async', function() {
44 | expect(f.extras).to.be.a('object');
45 | expect(f.extras.async).to.be.a('array');
46 | expect(f.extras.async).to.deep.equal(['test:src/require.async.comment.a.js', 'test:src/require.async.comment.b.js']);
47 | });
48 | });
49 |
50 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | /*
2 | * fis
3 | * http://fis.baidu.com/
4 | */
5 |
6 | 'use strict';
7 |
8 | var ld, rd;
9 |
10 | function pregQuote (str, delimiter) {
11 | // http://kevin.vanzonneveld.net
12 | return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&');
13 | }
14 |
15 |
16 | function addAsync(file, value) {
17 | var hasBrackets = false;
18 | var values = [];
19 | value = value.trim().replace(/(^\[|\]$)/g, function(m, v) {
20 | if (v) {
21 | hasBrackets = true;
22 | }
23 | return '';
24 | });
25 | values = value.split(/\s*,\s*/);
26 | values = values.map(function(v) {
27 | var info = fis.util.stringQuote(v);
28 | v = info.rest.trim();
29 | var uri = fis.uri.getId(v, file.dirname);
30 | if (file.extras.async.indexOf(uri.id) < 0) {
31 | file.extras.async.push(uri.id);
32 | }
33 | return info.quote + uri.id + info.quote;
34 | });
35 |
36 | return {
37 | values: values,
38 | hasBrackets: hasBrackets
39 | };
40 | }
41 |
42 | //analyse [@require.async id] syntax in comment
43 | function analyseComment(file, comment){
44 | var reg = /(@require\.async\s+)('[^']+'|"[^"]+"|[^\s;!@#%^&*()]+)/g;
45 | return comment.replace(reg, function(m, prefix, value){
46 | addAsync(file, value);
47 | return '';
48 | });
49 | }
50 |
51 | //require.async(path) to require resource
52 | function parseJs(content, file, conf){
53 | var reg = /"(?:[^\\"\r\n\f]|\\[\s\S])*"|'(?:[^\\'\n\r\f]|\\[\s\S])*'|(\/\/[^\r\n\f]+|\/\*[\s\S]+?(?:\*\/|$))|\b(require\.async|require)\s*\(\s*("(?:[^\\"\r\n\f]|\\[\s\S])*"|'(?:[^\\'\n\r\f]|\\[\s\S])*'|\[[\s\S]*?\])\s*/g;
54 | return content.replace(reg, function(m, comment, type, value){
55 | if(type){
56 | switch (type){
57 | case 'require.async':
58 | var res = addAsync(file, value);
59 | if (res.hasBrackets) {
60 | m = 'require.async([' + res.values.join(', ') + ']';
61 | } else {
62 | m = 'require.async(' + res.values.join(', ');
63 | }
64 | break;
65 | case 'require':
66 |
67 | // 只处理 require 的数组用法
68 | if (value[0] === '[') {
69 | var res = addAsync(file, value);
70 |
71 | m = 'require([' + res.values.join(', ') + ']';
72 | }
73 | break;
74 | }
75 | } else if (comment) {
76 | m = analyseComment(file, comment);
77 | }
78 | return m;
79 | });
80 | }
81 |
82 | // to analyse as js|css
83 | function parseHtml(content, file, conf){
84 | var reg = /(