【飞秋】JS 实现完美include

vs2010完美安装WTL 1、首先去下载WTL 地址:http://wtl.svn.sourceforge.net/viewvc/wtl/?view=tar   2、安装App Wizard 找到“VS安装目录\VC\VCWizards\AppWiz”这个目录,如我电脑上就是“D:\Program Files\Microsoft Visual Studio 11.0\VC\VCWizards\App 阅读详情

js为什么需要include?让我们想想这样1个场景,a.js 需要用到1个公用的common.js,当然你可以在用到a.js的页面使用<script src="common.js">,但假设有5个页面用到了a.js,你是不是要写5遍<script。而且要是以后a.js 又需要引用common2.js,你是不是又的修改5个页面了?

 

已有js include的一些问题

    在写这个之前在网上搜索了些资料,发现以前写的include都存在2个问题,这也是include需要解决的比较重要的2个问题。

   1、相对路径的问题:  在a.js中使用include("../js/common.js");  include 函数中肯定是使用相对路径,是相对a.js的路径。而a.js在html中使用<script>嵌入有可能是相对路径,有可能是绝对路径。  include函数如何才能真正确定common.js的绝对路径,或者是相对html的相对路径。网上一些为了解决这个问题,还需要加一些js变量,不方便。 

   2、引用的问题。  网上include函数的实现几乎都是使用下面2种方式插入common.js    

      document.write("<script src='" + .. + "></script>") 

    或者   

      var s = document.createElement("script");   

      s.src = ...;   

      head.insertAfter(s,...);   

    document.write 输出的脚本会在a.js后面加载,而createElement("script")创建的脚本是非阻塞加载。  所以如果在common.js加载完毕之前,a.js中调用了common.js的函数就会报错。

 

实现

     解决上面2个问题,就可以实现js include。 

   第1个问题,我的方法是先获取到a.js在html中的绝对路径(如果是相对路径,就转为绝对路径),然后再把common.js的路径转为绝对路径。 

   第2个问题,采用同步的ajax来请求common.js,这样就不会出现引用问题。

 

  实现代码如下:

 

view sourceprint?01 // 根据相对路径获取绝对路径 

02 function getPath(relativePath,absolutePath){ 

03     var reg = new RegExp("//.//./","g"); 

04     var uplayCount = 0;     // 相对路径中返回上层的次数。 

05     var m = relativePath.match(reg); 

06     if(m) uplayCount = m.length; 

07       

08     var lastIndex = absolutePath.length-1;  

09     for(var i=0;i<=uplayCount;i++){ 

10         lastIndex = absolutePath.lastIndexOf("/",lastIndex); 

11     } 

12     return absolutePath.substr(0,lastIndex+1) + relativePath.replace(reg,""); 

13 }        

14   

15 function include(jssrc){ 

16     // 先获取当前a.js的src。a.js中调用include,直接获取最后1个script标签就是a.js的引用。 

17     var scripts = document.getElementsByTagName("script"); 

18     var lastScript = scripts[scripts.length-1]; 

19     var src = lastScript.src; 

20     if(src.indexOf("http://")!=0 && src.indexOf("/") !=0){       

21         // a.js使用相对路径,先替换成绝对路径 

22         var url = location.href; 

23         var index = url.indexOf("?"); 

24         if(index != -1){ 

25             url = url.substring(0, index-1); 

26         } 

27           

28         src = getPath(src,url); 

29     } 

30     var jssrcs = jssrc.split("|");  // 可以include多个js,用|隔开 

31     for(var i=0;i<jssrcs.length;i++){ 

32         // 使用juqery的同步ajax加载js. 

33         // 使用document.write 动态添加的js会在当前js的后面,可能会有js引用问题 

34         // 动态创建script脚本,是非阻塞下载,也会出现引用问题 

35         $.ajax({type:'GET',url:getPath(jssrc,src),async:false,dataType:'script'}); 

36     } 

37 }

 

  在a.js中直接使用 include("../js/common.js");

 

多请求的问题

  使用上面的include看上去挺爽的,不过却带来另外1个严重的问题,就是多发送了1个ajax的请求。

  我们常常为了WEB性能,而合并js,减少请求。但使用include后却偏偏多了请求。如果这个问题不解决,相信很多人都不会在正式产品中使用include的了,除非是局域网产品。

 

  如何解决这个多请求的问题,我也思考很久,最后觉的单单使用客户端js是没办法解决了。所以就想到了使用服务端代码来解决

  还记的我之前有文章介绍 "js、css的合并、压缩、缓存管理"的时候,就通过服务器端代码在程序启动时候去合并js。

 

  所以我把include多请求的解决方案也加到里面去。就是在程序启动的时候去查找所有的js,发现有使用include的就把include中common.js的源代码替换该include函数。这样a.js中在运行的时候就没有include函数,而是真真包含了common.js的内容的js文件

 

后语

  丫的。说到最后,怎么又把所有的include都替换掉了,哪之前说的那么多不白说了。

 

  个人觉得,每个产品都应该要区分开发环境和产品环境(一般通过配置文件进行区分),在开发环境应该以开发效率为首要,而产品环境则以性能为首。所以这里的inlcude就应该要区分对待,在开发环境中使用js include来提高开发和维护效率,而在产品环境中则自动把所有include替换成真真的js文件的内容。

关注技术文章飞秋:http://www.freeeim.com/,24小时专业转载。

 

ScriptInclude:异步加载.js 脚本包含 ScriptInclude允许您将script标记异步加载到浏览器中。 我之所以这样做,是因为我想要像其他语言一样的#include语句,所以我尽了最大努力来重新创建它。 ScriptInclude的目标是体积小巧且易于理解。 没有依赖项管理或任何东西。 它应被缩小和内联,如下所示: <!-- ... --> < body > <!-- ... --> < script > // ScriptInclude, minified and inlined include = function ( ) { /* ... */ } // my stuff include ( 'jquery.js' , function ( ) { include ( 'main.js' ) ; } ) ; </ script > <!-- ... --> 立即下载

相关推荐

自己实现的飞秋,详细源码

自己实现的飞秋,详细源码

js数组中的include方法

include方法

Misnice的博客 2万+

STM32F103+LAN9252实战:从站代码迁移中的5个硬件坑与解决方案

本文分享了将EtherCAT从站代码从STM32F767迁移至STM32F103平台时,搭配LAN9252遇到的五个典型硬件问题及解决方案。核心挑战包括时钟源不匹配、FSMC时序配置、中断映射错误、片选资源不足以及Flash烧录异常。文章通过实战经验,强调了硬件差异对代码迁移的关键影响,并提供了具体的调试思路与配置方法。

p5l2m9n4o6q的博客 698

js includes 模糊匹配

includes 模糊匹配数组

初心 682

车辆动力学从入门到进阶之路(传统篇)

新手如何入门车辆动力学开发领域,本文为您引路!

CrazyRabbit的博客 1万+

STM32双ADC同步采样实战:FFT测量相位差的5个关键细节

本文深入探讨了利用STM32双ADC同步采样结合FFT算法精确测量信号相位差的实战技巧。文章聚焦五个关键细节:确保ADC时钟同源、优化DMA缓冲区设计、信号调理与窗函数选择、精确的相位提取与解缠绕,以及系统误差校准与验证。这些细节是提升相位差测量精度、确保系统稳定性的核心,尤其强调了STM32配置中易被忽视的时钟同步问题。

oauth7security的博客 596

JSP语法(6)Include 指命

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 418

State of GPT (ChatGPT 原理及现状介绍)

要用 RLHF 的一个简单的原因就是 RLHF 模型效果更好,下面的图来源于 InstructGPT 论文,PPO (RLHF 算法) 后的模型生成的答案更被人类喜欢。karpathy 认为 RLHF 有用的原因是判别比生成更容易,让标注员去写一些 SFT 的 QA 数据对是比较难的,如果有一个 SFT 模型生成一些数据让标注员判断哪个更好就简单很多。,GPT4 最强,前三个都是 RLHF 模型,其他模型都是 SFT 模型。伯克利做的模型评测榜单。

kebijuelun的博客 3580

如何在javascript文件里include另外一个javascript文件

通过Ajax加载 用ajax去加载额外的js文件,然后使用eval方法去加载文件。这个方法比较简单粗暴,但是由于js的跨域限制,只能加载同域名下的文件。并且eval方法可能会带来一些潜在bug. 通过Jquery加载 getScript() 方法通过 HTTP GET 请求载入并执行 JavaScript 文件. $.getScript("ajax/test.js", functi

fofabu2的博客 7913

流式数据湖存储技术,Apache Paimon是什么?

是一项流式数据湖存储技术,可以为用户提供高吞吐、低延迟的数据摄入、流式订阅以及实时查询能力。Paimon 采用开放的数据格式和技术理念,可以与 Apache Flink / Spark / Trino 等诸多业界主流计算引擎进行对接,共同推进 Streaming Lakehouse 架构的普及和发展。

一个写湿的程序猿 2万+

手把手教你用git上传项目到GitHub(图文并茂,这一篇就够了),相信你一定能成功!!

GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好。 GitHub可以免费使用,并且快速稳定。即使是付费帐户,每个月不超过10美刀的费用也非常便宜。 利用GitHub,你可以将项目存档,与其他人分享交流,并让其他开发者帮助你一起完成这个项目。优点在于,他支持多人共同完成一个项目,因此你们可以在同一页面对话交流。 创建自己的项目,并备份,代码不需要保存在本地或者服务器,GitHub做得非常理想。 学习Git也有很多好处。他被视为一个预先维护过程,你可以按自己

左手の明天的博客 3万+

JS 实现完美include

JS 实现完美include

qq_43668118的博客 2317

【信息系统项目管理师】高分论文:论信息系统项目的整合管理(绩效考核系统)

我们将项目管理计划中的子计划包括项目范围、进度、成本、质量管理计划,过程改进计划,人力资源管理计划,风险、采购管理计划,干系人管理计划,项目范围、成本、进度基准作为依据,查看项目的各个方面,通过组织全体团体成员会议来解读由各监控过程提供的信息,之后我与项目管理团队一起制订所需措施,确保项目绩效达到预期要求。在一个项目中,变更是必然的,也是不可避免的,进度拖延,成本失控,客户有新的需求等都会引起项目的变更。在本项目中,我要求有处于工作状态的产品,开发人员才可以对其任意修改,修改完成后,重新入库即可。

数据知道的博客 6888

ajax加载include,JS实现完美include加载功能代码

css文件的动态加载应用具有多种效果,css文件的动态加载的知识不计其数,但是总的方法还是动态加载css文件,下面是爱站技术频道小编带给大家的实现完美include.html" target="_blank">include加载功能代码,一起来了解一下吧!已有js include的一些问题在写这个之前在网上搜索了些资料,发现以前写的include都存在2个问题,这也是include需要解决的...

weixin_39684235的博客 583

系统分析师论文范文(三)微服务

摘要(300字) 2024年4月,我作为系统分析师参与某省三甲医院云影像系统建设项目,负责系统分析与设计工作。该项目旨在响应国家"无胶片化"医疗政策,解决传统影像系统数据孤岛、调阅效率低等问题。系统基于DICOM 3.0和HL7国际标准,采用B/S架构与Spring Cloud Alibaba微服务技术栈,包含影像采集、智能分析、数据安全等核心模块,实现全院影像资源的云端统一管理与多端调阅。在架构设计上,通过微服务拆分、分布式事务控制及多层次安全防护机制,保障了系统的高可用性与数据一致性。系统于2024年1

echo的博客 223

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

在html静态网页中实现include包含功能

在html静态网页中实现include包含功能 对于全站网页制作有用,不用配iis就可以把整站的头部导航和尾部以一个外部文件的方式引入,就好像asp php中的include功能。原理是从网上找的,后用js做了些改进。 js文件代码: var urls = document.getElementsByTagName("script"); var urls = urls[ur

csnewdn的专栏 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

终极跨平台Emoji解决方案:如何使用js-emoji库实现完美表情兼容性

在现代多设备互联网时代,Emoji表情已成为在线沟通不可或缺的元素。js-emoji作为一款专业的JavaScript表情转换库,通过智能设备检测和多种渲染模式,彻底解决了不同操作系统、浏览器和设备间的Emoji显示兼容性难题,让您的应用在手机、电脑、平板上都能提供一致的表情体验。 ## 📦 快速入门:两种高效集成方式 ### npm一键安装(推荐) 对于现代前端项目,通过npm安装是最便捷

gitblog_00694的博客 844

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

推荐文章:拥抱动态加载新时代 —— h-include.js 深度解析与应用指南

推荐文章:拥抱动态加载新时代 —— h-include.js 深度解析与应用指南 在现代前端开发中,构建响应迅速且高度可维护的Web应用是一个永恒的主题。为此,我们发现了一颗璀璨的明星——h-include.js,一个基于Custom Elements V1的声明式客户端转插技术库。今天,让我们一起探索它如何简化微前端架构的实现,并为我们的网页带来无缝的数据集成和更高效的渲染机制。 项目介绍 h...

gitblog_00067的博客 707

终极解决方案:如何让Emoji表情在所有设备上完美显示

还在为Emoji表情在不同设备上显示混乱而烦恼吗?😫 你是否遇到过在手机上发送的笑脸表情,在电脑上却变成了方块或问号?js-emoji库为你提供了完美的跨设备兼容性解决方案!这个强大的JavaScript库能够智能转换Emoji表情,确保在任何操作系统、任何浏览器、任何设备上都能获得一致的显示效果。 ## 🎯 痛点场景:为什么你的Emoji总是"水土不服" 想象一下这样的场景:你在iPho

gitblog_00739的博客 1064

vue keep-alive 详解 include,activated,deactivated 解决前进刷新,回退缓存

vue keep-alive 详解 include,activated,deactivated解决前进刷新,回退缓存 问题说明:有searchPage => A(搜索页面), searchResult => B(搜索结果页面),goodsDetail => C(详情页面) 三个页面,A页面输入搜索条件,进入B页面,然后跳转C页面。 需求:顺序要求是A - > B ->...

随笔记录-分享&记忆 4227
上一篇: 【飞秋】一起学Windows Phone7开发(十三.四 基本控件)
下一篇: 无论如何都是为了测试傻瓜搜索引擎
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值