├── 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 = /(|\s*>))([\s\S]*?)(?=<\/script>|$)/ig; 85 | content = content.replace(reg, function(m, $1, $2) { 86 | if($1){//