From 1f98e208937c9ec57cd6ed441d12b9f786cfc7d2 Mon Sep 17 00:00:00 2001 From: wenber Date: Thu, 15 Oct 2015 21:15:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=96=87=E4=BB=B6=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=85=88=E4=BB=8E=E5=86=85=E5=AD=98=E4=B8=AD?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=EF=BC=88=E5=8C=BF=E5=90=8D=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=EF=BC=89=EF=BC=8C=E5=90=A6=E5=88=99=E6=89=8D=E5=90=8C=E6=AD=A5?= =?UTF-8?q?IO=E6=93=8D=E4=BD=9C=EF=BC=88=E5=91=BD=E5=90=8D=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/processor/module-compiler.js | 6 +++- lib/util/compile-module.js | 47 +++++++++++++++++--------------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/lib/processor/module-compiler.js b/lib/processor/module-compiler.js index d8a6185..2161928 100644 --- a/lib/processor/module-compiler.js +++ b/lib/processor/module-compiler.js @@ -89,6 +89,7 @@ ModuleCompiler.prototype.isExclude = function( file ) { * @param {Function} callback 处理完成回调函数 */ ModuleCompiler.prototype.process = function ( file, processContext, callback ) { + var configFile = edp.path.resolve( processContext.baseDir, this.configFile ); @@ -107,16 +108,18 @@ ModuleCompiler.prototype.process = function ( file, processContext, callback ) { * 编译模块 * * @inner + * @param {ProcessContext} processContext 构建环境对象 * @param {Object} fileInfo 文件信息对象 * @param {string} modId 模块id * @param {boolean|Object} combine 合并选项,用于编译其依赖模块 */ - function compileModule( fileInfo, modId, combine ) { + function compileModule(processContext, fileInfo, modId, combine ) { if ( !fileInfo || file.get( 'module-combined' ) ) { return; } var moduleCode = require( '../util/compile-module' )( + processContext, fileInfo.data, modId, configFile, @@ -146,6 +149,7 @@ ModuleCompiler.prototype.process = function ( file, processContext, callback ) { isCombined = isCombined || !!isModuleCombined; if ( index === 0 ) { compiledCodes = compileModule( + processContext, file, moduleId, isModuleCombined diff --git a/lib/util/compile-module.js b/lib/util/compile-module.js index be1d2bc..b34e8f5 100644 --- a/lib/util/compile-module.js +++ b/lib/util/compile-module.js @@ -23,12 +23,13 @@ function getPackageMainCode( packageInfo ) { /** * 合并模块的代码 - * + * + * @param {ProcessContext} processContext 构建环境对象 * @param {ModuleInfo} moduleInfo 入口模块的信息. * @param {string} moduleConfig module.conf的路径. * @param {Object} excludeModules 需要排除的模块Id集合. */ -function combineModuleCode( moduleInfo, moduleConfig, excludeModules ) { +function combineModuleCode(processContext, moduleInfo, moduleConfig, excludeModules ) { var combineModules = moduleInfo.combineModules; var codes = []; @@ -47,24 +48,25 @@ function combineModuleCode( moduleInfo, moduleConfig, excludeModules ) { if ( fs.existsSync( depFile ) ) { excludeModules[ depId ] = 1; - - var code = compileModule( - fs.readFileSync( depFile, 'UTF-8' ), - depId, - moduleConfig, - // 我们不传递include下去,因为第一个入口文件能看到include的内容,所以相关的代码已经包含进来了, - // 后续的文件看不到也没关系,另外传递下去可能导致无限递归 - // - // 我们也不传递exclude下去,因为第一次的时候,已经把exclude中的pattern全部展开了,所以 - // 此时excludeModules里面是没有pattern的,都是具体的moduleId,因此不需要传递最原始的combine.exclude了 - // - // 综上所述,递归调用的时候,我们只需要传递{},表明需要combine即可. - // - // @see edp-build#19 - {}, - excludeModules - ); - + var depFileHash = require('path').relative(processContext.baseDir, depFile); + var code = compileModule( + processContext, + // 优先从内存中读取文件内容(针对匿名模块,按照路径查找),否则同步读取文件(针对命名模块) + processContext.files[depFileHash] ? (processContext.files[depFileHash].data) : (fs.readFileSync( depFile, 'UTF-8' )), + depId, + moduleConfig, + // 我们不传递include下去,因为第一个入口文件能看到include的内容,所以相关的代码已经包含进来了, + // 后续的文件看不到也没关系,另外传递下去可能导致无限递归 + // + // 我们也不传递exclude下去,因为第一次的时候,已经把exclude中的pattern全部展开了,所以 + // 此时excludeModules里面是没有pattern的,都是具体的moduleId,因此不需要传递最原始的combine.exclude了 + // + // 综上所述,递归调用的时候,我们只需要传递{},表明需要combine即可. + // + // @see edp-build#19 + {}, + excludeModules + ); if ( !code ) { edp.log.warn( 'Combine module code failed, can\'t combine [%s] to [%s]', @@ -161,6 +163,7 @@ function getAllModules( moduleConfig ) { /** * 编译模块 * + * @param {ProcessContext} processContext 构建环境对象 * @param {string} code 模块代码 * @param {string} moduleId 模块id * @param {string} moduleConfig 模块配置文件 @@ -168,7 +171,7 @@ function getAllModules( moduleConfig ) { * @param {Object=} excludeModules 如果合并依赖,需要一个对象指定不需要合并的模块 * @return {string} */ -function compileModule( code, moduleId, moduleConfig, combine, excludeModules ) { +function compileModule(processContext, code, moduleId, moduleConfig, combine, excludeModules ) { //{{{ 根据语法树分析模块 var ast = edp.amd.getAst( code ); if ( !ast ) { @@ -266,7 +269,7 @@ function compileModule( code, moduleId, moduleConfig, combine, excludeModules ) exclude: explicitExcludeModules, include: explicitIncludeModules } ); - var depCodes = combineModuleCode( moduleInfo, moduleConfig, excludeModules ); + var depCodes = combineModuleCode(processContext, moduleInfo, moduleConfig, excludeModules ); codes.push.apply( codes, depCodes ); if ( moduleId !== moduleInfo.id ) {