在html中,require的官方基本用法如下:

<!DOCTYPE html>
<html>
<head>
<title>My Sample Project</title>
<!-- data-main attribute tells require.js to load
scripts/main.js after require.js loads. -->
<script data-main="scripts/main" src="scripts/require.js"></script>
</head>
<body>
<h1>My Sample Project</h1>
</body>
</html>

但在实践过程中,我们可能会有很多需要配置的,比如jquery...

然后我们大约会把这些配置写到配置文件,如下:

// require.config.js

require.config({
paths: {
jquery : "/js/library/jquery.min",
},
shim : { }
});

然后,再在  main.js  中引用

//mian.js
require(["/js/require.config.js"],function(){
"use strict";
require(["jquery"], function ($) {
//功能代码
});
})

因为网页缓存问题,这种方式存在当 require.config.js 有修改时,客户端的 require.config.js 并不会更新的问题。同时如果有多个html都用了require,那每个模块的 main.js 都需要在头部加上述代码。

既然在require中引用 config,会有缓存问题,那我就把  require.config.js  放到 html ,并且增加版本控制。但需要注意的是, rquire.config.js  必须放到  require.js  后面,因为他用到了require类。

如下

<!DOCTYPE html>
<html>
<head>
<title>My Sample Project</title>
<!-- data-main attribute tells require.js to load
scripts/main.js after require.js loads. -->
<script data-main="scripts/main" src="scripts/require.js"></script>
<script src="scripts/require.config.js?v=xxx"></script>
</head>
<body>
<h1>My Sample Project</h1>
</body>
</html>

这种形式会存在一个新的问题:当 require.config.js  修改后,由于   require.js  已经在浏览器缓存,所以很快(快到  require.config.js 还未加载完成)就会加载  main.js ,此时 man.js 没有享受到  require.config.js 中的配置。

这里我想到了  require.js  的模式(先加载  require.js , 再加载  main.js )与现在的需求(先加载 require.config.js ,再加载 main.js )大概相同。所以看了  require.js  中的实现,把相关部分的代码复制到  require.config.js 。

最终,我使用的代码样例如下:

需要注意的是:html 中,需要移动 data-main 的位置:

<!DOCTYPE html>
<html>
<head>
<title>My Sample Project</title> scripts/main.js after require.js loads. -->
<script src="scripts/require.js"></script>
<!-- data-main 移动到这里 -->
<script src="scripts/require.config.js?v=xxx" data-main="scripts/main" ></script>
</head>
<body>
<h1>My Sample Project</h1>
</body>
</html>
// require.config.js
;(function () { let rev = 'xxxx'; let cfg = {
// 不设置超时 = 0
waitSeconds: 60, paths: {
'jquery': '../../../../Common/Common/jquery-3.3.1/dist/jquery.min', },
shim: {
'jquery': {exports: 'jQuery'}, },
urlArgs: function (id, url) {
if (url.indexOf('http') === 0) {
return '';
}
let args = `rev=${rev}`;
// /Common/Common 下的文件不用版本控制, 都是 3 方库
if (url.indexOf('/Common/Common/') >= 0) {
args = 'v=2'
}
return (url.indexOf('?') === -1 ? '?' : '&') + args;
}
}; let dataMain = '';
let scripts = document.getElementsByTagName('script');
for (let i = scripts.length - 1; i > -1; i -= 1) {
let script = scripts[i];
let src = script.getAttribute('src');
if (src.indexOf('require.common.config.js') > 0) {
dataMain = script.getAttribute('data-main');
if (dataMain) {
//Preserve dataMain in case it is a path (i.e. contains '?')
let mainScript = dataMain; //Set final baseUrl if there is not already an explicit one,
//but only do so if the data-main value is not a loader plugin
//module ID.
if (!cfg.baseUrl && mainScript.indexOf('!') === -1) {
//Pull off the directory of data-main for use as the
//baseUrl.
src = mainScript.split('/');
mainScript = src.pop();
let subPath = src.length ? src.join('/') + '/' : './'; cfg.baseUrl = subPath;
}
}
break;
}
} require.config(cfg); if (dataMain) {
require([dataMain]);
} }());

最新文章

  1. [Android]使用Dagger 2依赖注入 - DI介绍(翻译)
  2. background-image和img的区别
  3. Leetcode Simplify Path
  4. EPSON LQ610K 设置税控盘打印发票的格式
  5. powerdesigner逆向工程,从数据库导出PDM
  6. 不懂点CAP理论,你好意思说你是做分布式的吗?
  7. 2014年4月底至5月初51Aspx源码发布详情
  8. (六)play之yabe项目【验证码】
  9. LFS7.4编译笔记(2)
  10. OpenGL超级宝典第5版&amp;&amp;GLSL法线变换
  11. 带缓冲的IO和不带缓冲的IO
  12. TOGAF架构开发方法(ADM)之架构变更管理阶段
  13. 學習 DT device tree 以 ST 的開發板 STM32F429i-disc1 為例
  14. 使用 ConfigSource 特性 拆分 Web.config 文件
  15. var与let、const的区别
  16. 几个NAND/NOR门可以表示一个XOR门?
  17. 【转载】PhpStudy修改网站根目录
  18. Redis重大版本
  19. DS-博客作业03--栈和队列
  20. “全栈2019”Java多线程第三十六章:如何设置线程的等待截止时间

热门文章

  1. 刚从一道题发现的一些东西,PHP笔记,关于extract和null 空字符串
  2. git、gitLab、github区别
  3. 使用 GoLand 启动 运行 Go 项目
  4. phpcms 用phpexcel导入导出excel
  5. 创建线程的方式三:实现Callable接口-----JDK5.0 新增
  6. Linux hostname主机名查看和设置
  7. 听说你在从事前端开发?那这10个JavaScript的优化问题你不得不知道!
  8. mysql不同端口的连接
  9. 面试题总结-Java部分
  10. 27.rm命令