我无法理解如何根据项目结构设置requirejs的基本URL。
问题:并非所有html文件都位于同一文件夹级别。脚本文件路径不断变化,具体取决于html页面的位置。
我尝试了什么:我已经搜索了API,但我不明白BaseURL应该是什么来获得正确的路径对于所有页面。我已经测试了变体(../js/lib,/ js / lib /,我尝试不在main.js文件中包含所有变体),但下面这个是唯一一个似乎产生正确结果的变体某些文件。
Main.js
requirejs.config({
baseUrl: '../js/lib',
paths: {
'jquery' : (document.addEventListener) ? ['vendor/jquery'] : ['vendor/jquery-1.9.1']
},
shim: {
'foundation/foundation': {
deps: ['jquery']
},
'foundation/foundation.alert': {
deps: ['jquery', 'foundation/foundation']
},
'vendor/slick.min': {
deps: [
'jquery',
'foundation',
'foundation/foundation.interchange'
],
exports: 'slick'
}
}
});
requirejs(['jquery'
, 'foundation/foundation'
]);
文件夹结构
Main Folder
│
│ Some Folder
│ ├── css
│ ├── js
│ │ ├── lib
│ │ │ ├── foundation
│ │ │ │ ├── foundation.alert.js
│ │ │ │ ├── ...(foundation component js files)
│ │ │ │ ├── foundation.js
│ │ │ ├── vendor
│ │ │ │ ├── jquery-1.9.1.js
│ │ │ │ ├── jquery.js
│ │ │ ├── foundation.min.js
│ │ │ ├── slick.min.js
│ │ │ └── slickModule.js
│ │ ├── main.js
│ │ └── require.js
│ ├── html
│ │ ├── components
│ │ │ ├── slider.html [All scripts throw 404: Main Folder/Some Folder/html/js/lib/vendor/file.js ]
│ │ ├── home.html [loads files as expected]
│ │ ├── second.html [loads files as expected]
│ │ ├── subfolder
│ │ │ └── random.html
│ ├── extra folder
│ │ └── index.html [All scripts throw 404: Main Folder/Some Folder/extra folder/js/lib/vendor/file.js ]
│ │
│ Another Folder
│ ├── index.html [All scripts throw 404]
/html/components/slider.html
当我尝试以这种方式调用require时,slickModule的url是 "主文件夹/某些文件夹/ html / js / lib / slickModule.js" - 注意' html'在基本网址
之后添加<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script data-main="../../js/main" src="../../js/require.js"></script>
<script>
require(['../js/main'], function () {
require(['slickModule']);
});
</script>
</head>
<body>
...
</body>
</html>
有人可以帮我看看为什么会这样吗?
如果它甚至可能,我该怎么做才能使基本网址保持一致?
答案 0 :(得分:5)
data-main
属性将很困难(但并非不可能)。paths
配置选项指向文件,而不是相对路径。首先,您的data-main
属性可能会因behavior when used for multiple entry points is undocumented问题而遇到一些问题。正如它所说:
如果您想在HTML页面中进行
require()
次调用,则最好不要使用data-main。 data-main仅在页面只有一个主入口点data-main脚本时使用。对于想要进行内联require()
调用的网页,最好将其嵌套在require()
调用中以进行配置
其次,您使用data-main
属性加载定义库行为的配置(换句话说,require
/ requirejs
功能是自定义的) ,但随后您使用该自定义工具再次加载配置:
<script data-main="../../js/main" src="../../js/require.js"></script>
<script>
require(['../js/main'], function () {
require(['slickModule']);
});
</script>
我几乎是肯定的,这引入了一些奇怪的行为。
paths
来避免../
第三,您的baseUrl
自动设置为 加载HTML的位置或 data-main
脚本的位置。您可以通过创建单个入口点(可能是js/main
),然后定义paths configuration option来隐藏嵌套模块来利用它。
换句话说,您的应用程序永远不需要请求../
(或其任何变体),因为任何嵌套都应该被路径条目隐藏,如:
"paths": {
"slickModule": "lib/slickModule"
}
我知道这个答案并没有专门解决你的问题,但我很肯定这些问题中的一个 - 经过纠正 - 将解决你的问题。
答案 1 :(得分:4)
我在ASP.NET MVC4应用程序中遇到了同样的问题,结构如下:
Main Folder
├── Scripts
│ ├── Libraries
│ │ ├── jquery
│ │ | ├── jquery-1.10.2.min.js
...
我所做的是使用我的服务器端技术的方法来确定应用程序的根位置&#34;。就我而言,这是HttpRequest.ApplicationPath
,它在服务器上获取ASP.NET应用程序的虚拟应用程序根路径。&#34; (source)。
我的requirejs设置如下:
<script type="text/javascript">
var require = {
baseUrl: '@(Request.ApplicationPath)/Scripts',
paths: {
jquery: 'Libraries/jquery/jquery-1.10.2.min',
...
}
}
</script>
<script type="text/javascript" src="@Url.Content("~/Scripts/Libraries/require/require.js")"></script>
总结:
Scripts
文件夹path
都以Scripts
paths
配置中未指定的任何脚本也应该以{{1}} Scripts
希望有所帮助,显然您需要针对您正在使用的任何技术进行调整。
答案 2 :(得分:0)
由于您在不同级别的不同文件夹中有html文件,因此将baseUrl设置为相对路径(即../lib/js
)将适用于某些文件,但对于所有文件,这是可以预期的。您需要设置一个绝对路径,从根目录到lib文件夹,例如如果&#39;主要文件夹&#39;是你的root,你的baseUrl应该是/Some Folder/js/lib/
或/Some Folder/js/lib
。我希望有所帮助。