`
fly_ever
  • 浏览: 153307 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

liferay的js加载问题深度分析

阅读更多
今天遇到liferay一个很郁闷的问题
问题描述
在开发环境中,直接访问liferay系统,没有问题。
在运行环境中,经过一个中间系统转发,通过https来访问liferay系统,结果页面上出现很多js错误,并且有些功能不能使用。
解决思路
经过对页面的分析,发现页面存在css和js文件的缺失。
有点莫名其妙~~
比较两个环境,发现之后的环境与之前环境的区别为:经过了一次转发,以及使用了https。
确定是这个环境使访问liferay时缺失了某些js和css文件。
立即想考虑liferay是如何加载js和css文件的。
后来想到在配置文件中有网页内容传输以及js的相关配置,想试试对配置进行修改。
最后定位下来,是portal.properties下的属性 javascript.fast.load 在起作用。
设置 javascript.fast.load=false即可。
 
    #
    # Set this property to true to load the combined JavaScript files from the
    # property "javascript.files" into one compacted file for faster loading for
    # production. Set this property to false for easier debugging for
    # development. You can also disable fast loading by setting the URL
    # parameter "js_fast_load" to "0".
    #
    javascript.fast.load=false
该属性的含义:设置该属性为true,属性javascript.files中指定的js文件集将整合到一个文件中,进行压缩,然后加载,这样就能更快的加载。
如果设置为false,更容易在开发中进行调试。
也可以设置URL参数js_fast_load 为0,就不会快速加载。

深入分析
为了更具体比较把该参数设置为false之后的区别,
分别保存下设置为true和false之后的同一个页面。
发现设置为false时,在保存的那个页面文件夹中多了很多js文件。
仔细比较下载下来的js文件名称:
当设置为true时,下载了5个js文件。everything_packed.js文件的大小为4M多。
当设置为false时,下载了43个js文件,包含上述5个中的四个js,除了everything_packed.js。

跟踪加载js的过程:
首先查看处理js相关的文件:
1,在portal.properties中的js相关设置:
    javascript.files=\        设置js文件列表;
    javascript.fast.load=false
2,类com.liferay.portal.tools.JavaScriptBuidler中:
把javascript.files中的js文件列表合并到一个文件mergedFile中
	public JavaScriptBuilder(String jsDir, String mergedFile) {
		try {
			StringMaker sm = new StringMaker();

			String[] files = PropsUtil.getArray(PropsUtil.JAVASCRIPT_FILES);

			for (int i = 0; i < files.length; i++) {
				String content = FileUtil.read(jsDir + files[i]);

				sm.append(content);
				sm.append("\n");
			}

			FileUtil.write(mergedFile, sm.toString());
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}

3,页面  /html/common/themes/top_js.jsp中:
该页面判断属性javascript.fast.load值,并根据取值分别处理。即设为true的时候,只需要加载everything.packed.js文件,当设为false时,则循环加载属性javascript.files中设置的文件列表。
<c:choose>
	<c:when test='<%= ParamUtil.getBoolean(request, "js_fast_load", PropsValues.JAVASCRIPT_FAST_LOAD) %>'>

		<%--
		everything_packed.js includes all of the JavaScript files. It is
		autogenerated with the Ant build-javascript task.
		--%>

		<script src="<%= themeDisplay.getPathJavaScript() %>/everything_packed.js?bn=<%= ReleaseInfo.getBuildNumber() %>" type="text/javascript"></script>
	</c:when>
	<c:otherwise>

		<%
		String[] javaScriptFiles = PropsUtil.getArray(PropsUtil.JAVASCRIPT_FILES);

		for (int i = 0; i < javaScriptFiles.length; i++) {
		%>

			<script src="<%= themeDisplay.getPathJavaScript() %>/<%= javaScriptFiles[i] %>?bn=<%= ReleaseInfo.getBuildNumber() %>" type="text/javascript"></script>

		<%
		}
		%>

	</c:otherwise>
</c:choose>

4,再看ant文件,portal-web/build.xml:
在部署时,把设置的js文件列表合并到文件everything_unpacked.js中,然后使用压缩处理类,压缩成文件everything_packed.js。
	<target name="build-javascript">
		<java
			classname="com.liferay.portal.tools.JavaScriptBuilder"
			classpathref="project.classpath"
			fork="true"
			newenvironment="true"
		>
			<arg value="docroot/html/js/" />
			<arg value="docroot/html/js/everything_unpacked.js" />
		</java>
		<antcall target="build-javascript-cmd">
			<param name="js.from.file" value="docroot/html/js/everything_unpacked.js" />
			<param name="js.to.file" value="docroot/html/js/everything_packed.js" />
		</antcall>
	
		<target name="build-javascript-cmd">
		<java
			classname="com.yahoo.platform.yui.compressor.YUICompressor"
			classpathref="project.classpath"
			fork="true"
			newenvironment="true"
		>
			<arg line="--type js -o ${js.to.file} ${js.from.file}" />
		</java>

		<!--
		http://dean.edwards.name/download/#packer
		http://homepages.nildram.co.uk/~9jack9/download/packer.wsh.zip
		-->

		<!--<exec executable="cmd">
			<arg line="/c CScript /nologo ${project.dir}/tools/pack.wsf ${js.from.file} > ${js.to.file}" />
		</exec>-->
	</target>

结论
由上面文件即可得出对js的处理流程:
在部署时,运行ant->build.xml->com.liferay.portal.tools.JavaScriptBuilder,进行压缩处理,文件生成到目录docroot/html/js/everything.packed.js。
页面展示时,页面/html/common/themes/top_js.jsp根据配置信息加载js文件。

存在的问题
这个过程中,还有一个疑问:在服务器目录下看到的everything.packed.js文件大小只有301k。
但是下载下来的页面,包含的everything.packed.js文件大小有4.52M。
因此下载下来的js并不是服务器目录上的那个everything.packed.js文件。
分享到:
评论
1 楼 eccojap 2009-01-10  
没做过web,也不太懂javascript,但要解决一个Liferay的js打包相关问题,太巧了,谢谢啊。

相关推荐

    liferay扩展环境 liferay ext

    1. **扩展框架**:Liferay Ext基于Maven构建,它提供了一个框架,开发者可以在其中添加自定义的类加载器,使得新的类和配置可以优先于默认的Liferay类加载,实现对核心功能的扩展。 2. **portlet开发**:通过...

    liferay portlet例子

    liferay portlet例子 liferay portlet例子

    Liferay合集.zip

    中文文档部分可能包含了Liferay的基础教程、最佳实践、常见问题解答等,这些文档对于中文环境下的学习者来说尤其方便,能够快速理解Liferay的关键概念,解决在使用过程中遇到的问题。 通过学习这些资料,开发者可以...

    前端开源库-eslint-config-liferay

    它通过解析JavaScript代码并对其进行抽象语法树(AST)分析,从而实现对代码的全面检查。ESLint的核心优势在于其高度可定制性,用户可以根据项目需求创建自己的规则集,或者直接使用社区维护的配置,如`eslint-...

    liferay6.2开发完全指南

    - **深入扩展**:Liferay提供了丰富的API和插件机制,允许开发者对平台进行深度自定义,包括工作流、权限管理、用户界面等。 3. **选择开发工具** - **Maven**:对于偏好Maven的开发者,Liferay提供了支持,可以...

    Liferay Portal Liferay IDE

    Liferay Portal Liferay IDE

    liferay经典书籍8本

    Liferay DXP是Liferay的最新版本,这本书全面解析了其新特性和改进。内容包括内容管理系统、移动支持、API设计以及与外部系统的集成,让读者了解如何充分利用Liferay DXP的潜力。 7. 《Liferay Portlet Development...

    Liferay6.0开发指南

    ### Liferay 6.0 开发指南核心知识点详解 #### 一、引言与概述 Liferay是一款功能强大且设计优秀的开源门户系统,其版本6.0尤其在多个方面进行了优化和完善,为开发者提供了更加友好和高效的工作环境。本指南旨在...

    liferay6.1开发学习

    【Liferay 6.1 开发学习】 Liferay 是一款开源的企业级门户平台,它提供了内容管理、社交网络、协作工具等功能,适用于构建企业内部或对外的网站和工作平台。Liferay 6.1 版本是其重要的里程碑,包含了丰富的功能...

    liferay6.06

    本文将深入探讨Liferay Portal的基础知识,安装配置,源码分析,开发环境设置,以及基于Struts2的Portlet应用开发等关键知识点。 1. Liferay Portal初体验: Liferay Portal是一款功能强大的企业级门户平台,支持多...

    liferay详细讲解 liferay项目完全讲解

    Liferay是一款开源的企业级门户平台,它提供了丰富的功能和高度可定制性,广泛应用于构建企业网站、内部系统、协作平台等。在这个“liferay详细讲解 liferay项目完全讲解”的资料包中,我们可以期待深入了解到关于...

    liferay解决无法访问页面问题

    #### 一、问题背景与分析 在使用 Liferay 平台开发或管理网站时,可能会遇到一种常见的错误消息:“You do not have permission to view this page”。此错误提示表明当前用户账户缺少访问特定页面(在这里通常指的...

    liferay6.0.5在ie6ie7操作布局等功能时的js错误解决方法和补丁包

    在Liferay 6.0.5版本中,由于浏览器兼容性问题,尤其是针对较老的Internet Explorer(IE)版本,如IE6和IE7,用户可能会遇到JavaScript错误,导致页面加载不完全或功能无法正常工作。这些问题主要集中在页面布局和...

    liferay

    ### Liferay Portal 二次开发详解 #### 一、Liferay Portal 概览 **Liferay Portal** 是一款开源的企业级门户平台,它基于Java技术构建,支持多种标准,包括JSR 168 和 WSRP (Web Services for Remote Portlets)。...

    Liferay 6 入门教程

    "plugins开发指南13-liferay中使用ldap分析.pdf"讨论了Liferay与LDAP(轻量级目录访问协议)的集成,这对于大型企业需要与现有用户目录系统同步的场景非常有用。最后,"plugins开发指南19-liferay6中使用JSON.pdf...

    liferay快速入门quickstart

    ### Liferay快速入门知识点详解 #### 一、Liferay Portal简介与快速启动 Liferay Portal是一款功能强大且灵活的企业级门户平台,它基于Java技术,遵循JSR-168标准,提供了丰富的特性来满足企业内外部网站的需求。...

    liferay 6.0 开发指南

    ### Liferay 6.0 开发指南核心知识点详解 #### 一、引言与核心技术 在《Liferay 6.0 开发指南》中,首先介绍了Liferay 6.0的核心技术及其开发策略。Liferay是一款强大的开源门户平台,支持企业级应用的构建与部署...

    liferay性能调优文档

    同时,日志分析也是识别问题的重要途径,应适当调整日志级别以获取足够的诊断信息。 8. **负载测试与性能基准**:通过工具如Apache JMeter进行负载测试,模拟真实用户行为,找出系统在压力下的性能表现。根据测试...

    LIferay6开发书籍

    其次,《Liferay 用户开发接口》深入解析了Liferay中的用户管理和权限控制机制。这包括用户账户的创建、管理,角色和组的设定,以及基于角色的访问控制(RBAC)。开发者将了解到如何定制用户界面,实现个性化用户...

    Liferay portlet 工程示例代码

    开发者可以通过分析和修改这些示例来学习和实践Liferay Portlet开发。 以上知识点涵盖了Liferay Portlet开发的基础和关键点,通过深入研究和实践提供的"samples",开发者可以逐步掌握创建功能丰富的Liferay Portlet...

Global site tag (gtag.js) - Google Analytics