diff --git a/ISSUE_TEMPLATE b/ISSUE_TEMPLATE index 7ce2fb30a..9b137d580 100644 --- a/ISSUE_TEMPLATE +++ b/ISSUE_TEMPLATE @@ -1,31 +1,7 @@ - - * **操作系统**: -* **Node版本**: -* **FIS版本**: -* **解决方案**: +* **Node版本**: +* **FIS版本**: +* **解决方案**: * **依赖插件**: - + diff --git a/README.md b/README.md index 1db28c7e9..d41f3459d 100644 --- a/README.md +++ b/README.md @@ -4,23 +4,30 @@ ![](https://img.shields.io/npm/v/fis3.svg) ![](https://img.shields.io/npm/dm/fis3.svg) [![Build Status](https://travis-ci.org/fex-team/fis3.svg?branch=master)](https://travis-ci.org/fex-team/fis3) [![Coverage Status](https://coveralls.io/repos/fex-team/fis3/badge.svg?branch=master&service=github)](https://coveralls.io/github/fex-team/fis3?branch=master) +[![](https://david-dm.org/fex-team/fis3/status.svg)](https://david-dm.org/fex-team/fis3) FIS3 面向**前端**的**工程构建系统**。解决前端工程中性能优化、资源加载(异步、同步、按需、预加载、依赖管理、合并、内嵌)、模块化开发、自动化工具、开发规范、代码部署等问题。 > 如果对FIS先有些了解,但理解不深的,可试着带着这句话去看文档
> FIS3 会在配置文件中给文件添加相应属性,用于控制文件的编译、合并等各种操作;文件属性包括基本属性和插件属性,[详细请参考](https://github.com/fex-team/fis3/blob/master/doc/docs/api/config-props.md#文件属性) -``` +```bash npm install -g fis3 ``` +**如果 Node 版本低于 4.x 请安装旧版本** + +```bash +npm install -g fis3@3.4.36 +``` + ## 文档 快速入门、配置、插件开发以及原理等文档 [doc/docs/INDEX.md](doc/docs/INDEX.md) ## 例子 -``` +```bash mkdir my-proj cd my-proj fis3 init @@ -73,12 +80,12 @@ https://github.com/fex-team/fis3-demo ## 常用插件 -###优化类(插件属性:optimizer) +### 优化类(插件属性:optimizer) - [fis-optimizer-uglify-js](https://www.npmjs.com/package/fis-optimizer-uglify-js) UglifyJS2 压缩插件 - [fis-optimizer-clean-css](https://www.npmjs.com/package/fis-optimizer-clean-css) CleanCss 压缩插件 - [fis-optimizer-png-compressor](https://www.npmjs.com/package/fis-optimizer-png-compressor) PNG 压缩插件 -###预处理类(插件属性:parser) +### 预处理类(插件属性:parser) - [fis-parser-less](https://www.npmjs.com/package/fis-parser-less) less 解析插件 - [fis-parser-node-sass](https://www.npmjs.com/package/fis-parser-node-sass) sass / scss 解析插件 - [fis-parser-handlebars](https://www.npmjs.com/package/fis-parser-handlebars) handlebars 解析插件 diff --git a/doc/docs/beginning/debug.md b/doc/docs/beginning/debug.md index d85f57028..25a09adf5 100644 --- a/doc/docs/beginning/debug.md +++ b/doc/docs/beginning/debug.md @@ -68,6 +68,9 @@ fis3 release -wL 当我们开发项目后,需要发布到测试机(联调机),一般可以通过如 SMB、FTP 等上传代码。FIS3 默认支持使用 HTTP 上传代码,首先需要在测试机部署上传接收脚本(或者服务),这个脚本非常简单,现在给出了 [php 的实现版本](https://github.com/fex-team/fis-command-release/blob/master/tools/receiver.php),可以把它放到测试机上某个 Web 服务根目录,并且配置一个 url 能访问到即可。 +> 注意:**此代码存在很大的安全隐患,没有做任何安全考虑,请不要部署到线上服务。** +> 百度内部请使用:http://agroup.baidu.com/fis/md/article/196978 + > 示例脚本是 php 脚本,测试机 Web 需要支持 PHP 的解析
> 如果需要其他语言实现,请参考这个 php 脚本实现,如果嫌麻烦,我们提供了一个 node 版本的[接收端](https://github.com/fex-team/receiver) diff --git a/doc/docs/pack.md b/doc/docs/pack.md index 5bf194413..56b475418 100644 --- a/doc/docs/pack.md +++ b/doc/docs/pack.md @@ -75,10 +75,10 @@ fis.match('::package', { // main.js 的所有同步依赖加入队列 '/static/hello/src/main.js:deps', - // 将 main.js 所以异步依赖加入队列 + // 将 main.js 的所有异步依赖加入队列 '/static/hello/src/main.js:asyncs', - // 移除 comp.js 所有同步依赖 + // 移除 comp.js 的所有同步依赖 '!/static/hello/src/comp.js:deps' ], diff --git a/doc/package.json b/doc/package.json index 3b96e2beb..804e37b32 100644 --- a/doc/package.json +++ b/doc/package.json @@ -16,7 +16,7 @@ "license": "MIT", "dependencies": { "fis3-postpackager-loader": "^1.0.17", - "highlight.js": "^8.6.0", + "highlight.js": ">=9.18.2", "marked": "^0.3.3" } } diff --git a/lib/compile.js b/lib/compile.js index 2363a20f5..89a81c8d5 100644 --- a/lib/compile.js +++ b/lib/compile.js @@ -319,7 +319,7 @@ function analyseComment(comment, callback) { * @memberOf fis.compile */ function extJs(content, callback, file) { - var reg = /"(?:[^\\"\r\n\f]|\\[\s\S])*"|'(?:[^\\'\n\r\f]|\\[\s\S])*'|(\/\/[^\r\n\f]+|\/\*[\s\S]*?(?:\*\/|$))|\b(__inline|__uri|__require|__id|__moduleId|__hash)\s*\(\s*("(?:[^\\"\r\n\f]|\\[\s\S])*"|'(?:[^\\'\n\r\f]|\\[\s\S])*')\s*\)/g; + var reg = /"(?:[^\\"\r\n\f]|\\[\s\S])*"|'(?:[^\\'\n\r\f]|\\[\s\S])*'|((?=0.8.0" - } -} diff --git a/test/util.js b/test/util.js index adc91692b..f923dbb7c 100644 --- a/test/util.js +++ b/test/util.js @@ -1163,105 +1163,105 @@ describe('util: _parseUrl(url, opt)', function () { }); //hide- local -describe('util: _download(url, [callback], [extract], [opt])', function () { - var downdir = __dirname + '/download/'; - this.timeout(25000); - before(function () { - //清空fis tmp download dir - var files = []; - var tmpdir = fis.project.getTempPath('downloads'); - var path = tmpdir; - if (fs.existsSync(path)) { - files = fs.readdirSync(path); - files.forEach(function (file, index) { - var curPath = path + "/" + file; - fs.unlinkSync(curPath); - }); - } - }); - it('general', function (done) { - //var url = 'http://10.48.30.87:8088/test/download/downTest01.tar'; - //var url = 'http://fex.baidu.com/fis3/static/images/code_1750c9a.png'; - var url = 'http://127.0.0.1/fis3/test/attachment/code_1750c9a.png'; - //var url = 'https://raw.githubusercontent.com/fex-team/fis3/gh-pages/logo_8652a39.png'; - - var path = fis.project.getTempPath('downloads'); - var hash = fis.util.md5(url, 8); - _.download(url, function (err) { - //expect(path + '/' + hash + '.png').to.be.exist; - expect(fs.existsSync(path + '/' + hash + '.png')).to.be.true; - done(); - }); - - }); - - it('extract', function (done) { - var name = 'downTest'; - //var url = 'http://10.48.30.87:8088/test/download/' + name + '.tar'; - //var url = 'http://fex.baidu.com/fis3/test/attachment/downTest.tar'; - var url = 'http://127.0.0.1/fis3/test/attachment/downTest.tar'; - //var url = 'https://raw.githubusercontent.com/fex-team/fis3/gh-pages/test/test.jar'; - var extract = downdir; - _.download(url, function (err) { - var hash = fis.util.md5(url, 8); - var path = fis.project.getTempPath('downloads'); - expect(fs.existsSync(path + '/' + hash + '.tar')).to.be.true; - expect(fs.existsSync(extract + '/downTest')).to.be.true; - - done(); - }, extract); //, extract 解压有问题 这种情况 还未处理 - - }); - - it('not_exist', function (done) { - //var url = 'http://fex.baidu.com/fis3/test/downTest05.tar'; //不存在的包 - var url = 'http://127.0.0.1/fis3/test/downTest05.tar'; //不存在的包 - var not_exist = 0; - _.download(url, function (msg) { - if (msg == 404) - not_exist = 1; - - var path = fis.project.getTempPath('downloads'); - var hash = fis.util.md5(url, 8); - expect(fs.existsSync(path + '/' + hash + '.tar')).to.be.false; - expect(not_exist).to.be.equal(1); - - done(); - - }); - - }); - - it('extract-error', function (done) { - //var url = 'http://fex.baidu.com/fis3/test/downTest05.tar'; - var url = 'http://127.0.0.1/fis3/test/downTest05.tar'; - var not_exist = 0; - var extract = downdir; - _.download(url, function (msg) { - if (msg == 404) - not_exist = 1; - - var hash = fis.util.md5(url, 8); - expect(fs.existsSync(extract + '/' + hash + '.tar')).to.be.false; - expect(not_exist).to.be.equal(1); - - done(); - }, extract, { - 'data': "write opt.data!" - }); - }); - - it('下载错误', function () { - var url = 'http://10.48.30.87:8088/test/download/test.tar.gz'; - var extract = downdir; - _.download(url, function () { - var hash = fis.util.md5(url, 8); - var path = fis.project.getTempPath('downloads'); - expect(fs.existsSync(path + '/' + hash + '.tar')).to.be.false; - }, extract); - }); - -}); +// describe('util: _download(url, [callback], [extract], [opt])', function () { +// var downdir = __dirname + '/download/'; +// this.timeout(25000); +// before(function () { +// //清空fis tmp download dir +// var files = []; +// var tmpdir = fis.project.getTempPath('downloads'); +// var path = tmpdir; +// if (fs.existsSync(path)) { +// files = fs.readdirSync(path); +// files.forEach(function (file, index) { +// var curPath = path + "/" + file; +// fs.unlinkSync(curPath); +// }); +// } +// }); +// it('general', function (done) { +// //var url = 'http://10.48.30.87:8088/test/download/downTest01.tar'; +// //var url = 'http://fex.baidu.com/fis3/static/images/code_1750c9a.png'; +// var url = 'http://127.0.0.1/fis3/test/attachment/code_1750c9a.png'; +// //var url = 'https://raw.githubusercontent.com/fex-team/fis3/gh-pages/logo_8652a39.png'; + +// var path = fis.project.getTempPath('downloads'); +// var hash = fis.util.md5(url, 8); +// _.download(url, function (err) { +// //expect(path + '/' + hash + '.png').to.be.exist; +// expect(fs.existsSync(path + '/' + hash + '.png')).to.be.true; +// done(); +// }); + +// }); + +// it('extract', function (done) { +// var name = 'downTest'; +// //var url = 'http://10.48.30.87:8088/test/download/' + name + '.tar'; +// //var url = 'http://fex.baidu.com/fis3/test/attachment/downTest.tar'; +// var url = 'http://127.0.0.1/fis3/test/attachment/downTest.tar'; +// //var url = 'https://raw.githubusercontent.com/fex-team/fis3/gh-pages/test/test.jar'; +// var extract = downdir; +// _.download(url, function (err) { +// var hash = fis.util.md5(url, 8); +// var path = fis.project.getTempPath('downloads'); +// expect(fs.existsSync(path + '/' + hash + '.tar')).to.be.true; +// expect(fs.existsSync(extract + '/downTest')).to.be.true; + +// done(); +// }, extract); //, extract 解压有问题 这种情况 还未处理 + +// }); + +// it('not_exist', function (done) { +// //var url = 'http://fex.baidu.com/fis3/test/downTest05.tar'; //不存在的包 +// var url = 'http://127.0.0.1/fis3/test/downTest05.tar'; //不存在的包 +// var not_exist = 0; +// _.download(url, function (msg) { +// if (msg == 404) +// not_exist = 1; + +// var path = fis.project.getTempPath('downloads'); +// var hash = fis.util.md5(url, 8); +// expect(fs.existsSync(path + '/' + hash + '.tar')).to.be.false; +// expect(not_exist).to.be.equal(1); + +// done(); + +// }); + +// }); + +// it('extract-error', function (done) { +// //var url = 'http://fex.baidu.com/fis3/test/downTest05.tar'; +// var url = 'http://127.0.0.1/fis3/test/downTest05.tar'; +// var not_exist = 0; +// var extract = downdir; +// _.download(url, function (msg) { +// if (msg == 404) +// not_exist = 1; + +// var hash = fis.util.md5(url, 8); +// expect(fs.existsSync(extract + '/' + hash + '.tar')).to.be.false; +// expect(not_exist).to.be.equal(1); + +// done(); +// }, extract, { +// 'data': "write opt.data!" +// }); +// }); + +// it('下载错误', function () { +// var url = 'http://10.48.30.87:8088/test/download/test.tar.gz'; +// var extract = downdir; +// _.download(url, function () { +// var hash = fis.util.md5(url, 8); +// var path = fis.project.getTempPath('downloads'); +// expect(fs.existsSync(path + '/' + hash + '.tar')).to.be.false; +// }, extract); +// }); + +// }); describe('util: _upload(url, [opt], [data], content, subpath, callback)', function () { this.timeout(20000); @@ -1334,133 +1334,133 @@ describe('util: _upload(url, [opt], [data], content, subpath, callback)', functi // }); }); -describe('util: _install(name, [version], opt)', function () { - var installdir = __dirname + '/install/'; - this.timeout(25000); - after(function () { - //清空install文件夹 - fis.cache.clean(installdir); - }); - - it('general', function (done) { - var name = 'installTest'; - var version = '*';//* - var opt = { - //'remote': 'http://10.48.30.87:8088/test/install', - //'remote': 'http://fex.baidu.com/fis3/test/attachment/install', - 'remote': 'http://127.0.0.1/fis3/test/attachment/install', - 'extract': installdir, - 'done': function () { - var hash = fis.util.md5(opt.remote + '/' + name + '/' + version + '/.tar', 8); - var path = fis.project.getTempPath('downloads'); - expect(path + '/' + hash + '.tar').to.be.exist; - expect(installdir + name).to.be.exist; - done(); - } - }; - - _.install(name, version, opt); - - }); - - it('version-done', function (done) { - var name = 'installTest'; - var version = '0.3'; - var opt = { - //'remote': 'http://10.48.30.87:8088/test/install', - //'remote': 'http://fex.baidu.com/fis3/test/attachment/install', - 'remote': 'http://127.0.0.1/fis3/test/attachment/install', - 'extract': installdir, - 'done': function () { - var hash = fis.util.md5(opt.remote + '/' + name + '/' + version + '/.tar', 8); - var path = fis.project.getTempPath('downloads'); - expect(path + '/' + hash + '.tar').to.be.exist; - expect(installdir + name + version).to.be.exist; - - done(); - } - }; - - _.install(name, version, opt); - }); - - it('opt.before', function (done) { - var gname = 'installTest'; - var version = '0.2'; - var opt = { - //'remote': 'http://10.48.30.87:8088/test/install', - //'remote': 'http://fex.baidu.com/fis3/test/attachment/install', - 'remote': 'http://127.0.0.1/fis3/test/attachment/install', - 'extract': installdir, - 'done': function (name, version) { - expect(path + '/' + hash + '.tar').to.be.exist; - expect(installdir + name + version).to.be.exist; - - done(); - }, - 'before': function (name, version) { - expect(name).to.be.equal(gname); - expect(version).to.be.equal("0.2"); - } - }; - var hash = fis.util.md5(opt.remote + '/' + gname + '/' + version + '/.tar', 8); - var path = fis.project.getTempPath('downloads'); - - _.install(gname, version, opt); - }); - - it('opt.err_not exist', function (done) { - var gname = 'installTest'; - var version = '0.5'; //不存在的版本 - var opt = { - //'remote': 'http://10.48.30.87:8088/test/install', - //'remote': 'http://fex.baidu.com/fis3/test/attachment/install', - 'remote': 'http://127.0.0.1/fis3/test/attachment/install', - 'extract': installdir, - 'done': function (name, version) { - expect(true).to.be.false; - }, - 'before': function (name, version) { - expect(name).to.be.equal(gname); - expect(version).to.be.equal("0.5"); - }, - 'error': function (err) { - var hash = fis.util.md5(opt.remote + '/' + gname + '/' + version + '/.tar', 8); - var path = fis.project.getTempPath('downloads'); - expect(fs.existsSync(path + '/' + hash + '.tar')).to.be.false; - expect(fs.existsSync(installdir + gname + version)).to.be.false; - - done(); - } - }; - _.install(gname, version, opt); - - }); - - it('extract, pkg', function () { - //pkg项目package.json里配置依赖pkg0.2,两个都应该install - var name = 'pkgTest'; - var version = '*'; - var opt = { - //'remote': 'http://10.48.30.87:8088/test/install', - //'remote': 'http://fex.baidu.com/fis3/test/attachment/install', - 'remote': 'http://127.0.0.1/fis3/test/attachment/install', - 'extract': installdir, - 'done': function () { - var hash = fis.util.md5(opt.remote + '/' + name + '/latest.tar', 8); - var hash_dep = fis.util.md5(opt.remote + '/' + name + '/0.2.tar', 8); - var path = fis.project.getTempPath('downloads'); - expect(path + '/' + hash + '.tar').to.be.exist; - expect(path + '/' + hash_dep + '.tar').to.be.exist; - expect(installdir + name).to.be.exist; - expect(installdir + dep_name).to.be.exist; - } - }; - var dep_name = 'pkgTest0.2'; - - _.install(name, version, opt); - }); -}); +// describe('util: _install(name, [version], opt)', function () { +// var installdir = __dirname + '/install/'; +// this.timeout(25000); +// after(function () { +// //清空install文件夹 +// fis.cache.clean(installdir); +// }); + +// it('general', function (done) { +// var name = 'installTest'; +// var version = '*';//* +// var opt = { +// //'remote': 'http://10.48.30.87:8088/test/install', +// //'remote': 'http://fex.baidu.com/fis3/test/attachment/install', +// 'remote': 'http://127.0.0.1/fis3/test/attachment/install', +// 'extract': installdir, +// 'done': function () { +// var hash = fis.util.md5(opt.remote + '/' + name + '/' + version + '/.tar', 8); +// var path = fis.project.getTempPath('downloads'); +// expect(path + '/' + hash + '.tar').to.be.exist; +// expect(installdir + name).to.be.exist; +// done(); +// } +// }; + +// _.install(name, version, opt); + +// }); + +// it('version-done', function (done) { +// var name = 'installTest'; +// var version = '0.3'; +// var opt = { +// //'remote': 'http://10.48.30.87:8088/test/install', +// //'remote': 'http://fex.baidu.com/fis3/test/attachment/install', +// 'remote': 'http://127.0.0.1/fis3/test/attachment/install', +// 'extract': installdir, +// 'done': function () { +// var hash = fis.util.md5(opt.remote + '/' + name + '/' + version + '/.tar', 8); +// var path = fis.project.getTempPath('downloads'); +// expect(path + '/' + hash + '.tar').to.be.exist; +// expect(installdir + name + version).to.be.exist; + +// done(); +// } +// }; + +// _.install(name, version, opt); +// }); + +// it('opt.before', function (done) { +// var gname = 'installTest'; +// var version = '0.2'; +// var opt = { +// //'remote': 'http://10.48.30.87:8088/test/install', +// //'remote': 'http://fex.baidu.com/fis3/test/attachment/install', +// 'remote': 'http://127.0.0.1/fis3/test/attachment/install', +// 'extract': installdir, +// 'done': function (name, version) { +// expect(path + '/' + hash + '.tar').to.be.exist; +// expect(installdir + name + version).to.be.exist; + +// done(); +// }, +// 'before': function (name, version) { +// expect(name).to.be.equal(gname); +// expect(version).to.be.equal("0.2"); +// } +// }; +// var hash = fis.util.md5(opt.remote + '/' + gname + '/' + version + '/.tar', 8); +// var path = fis.project.getTempPath('downloads'); + +// _.install(gname, version, opt); +// }); + +// it('opt.err_not exist', function (done) { +// var gname = 'installTest'; +// var version = '0.5'; //不存在的版本 +// var opt = { +// //'remote': 'http://10.48.30.87:8088/test/install', +// //'remote': 'http://fex.baidu.com/fis3/test/attachment/install', +// 'remote': 'http://127.0.0.1/fis3/test/attachment/install', +// 'extract': installdir, +// 'done': function (name, version) { +// expect(true).to.be.false; +// }, +// 'before': function (name, version) { +// expect(name).to.be.equal(gname); +// expect(version).to.be.equal("0.5"); +// }, +// 'error': function (err) { +// var hash = fis.util.md5(opt.remote + '/' + gname + '/' + version + '/.tar', 8); +// var path = fis.project.getTempPath('downloads'); +// expect(fs.existsSync(path + '/' + hash + '.tar')).to.be.false; +// expect(fs.existsSync(installdir + gname + version)).to.be.false; + +// done(); +// } +// }; +// _.install(gname, version, opt); + +// }); + +// it('extract, pkg', function () { +// //pkg项目package.json里配置依赖pkg0.2,两个都应该install +// var name = 'pkgTest'; +// var version = '*'; +// var opt = { +// //'remote': 'http://10.48.30.87:8088/test/install', +// //'remote': 'http://fex.baidu.com/fis3/test/attachment/install', +// 'remote': 'http://127.0.0.1/fis3/test/attachment/install', +// 'extract': installdir, +// 'done': function () { +// var hash = fis.util.md5(opt.remote + '/' + name + '/latest.tar', 8); +// var hash_dep = fis.util.md5(opt.remote + '/' + name + '/0.2.tar', 8); +// var path = fis.project.getTempPath('downloads'); +// expect(path + '/' + hash + '.tar').to.be.exist; +// expect(path + '/' + hash_dep + '.tar').to.be.exist; +// expect(installdir + name).to.be.exist; +// expect(installdir + dep_name).to.be.exist; +// } +// }; +// var dep_name = 'pkgTest0.2'; + +// _.install(name, version, opt); +// }); +// }); //hide- local -end describe('util: _.readJSON(path)', function () { it('general-readJson', function () {