AMD中的'require'是同步的(异步模块定义)吗?如果是这样,是什么让这个规范异步?如果我在我的代码中间有require()(并且尚未加载),它会停止执行吗?在浏览器方面说话.
我正在将breezeJS集成到已经使用knockoutJS的现有requireJS项目中.我遇到了几个问题.
第一个是breeze无法加载Q库,除非我将它作为<script>标记包含在我的html包装器上,而不是作为加载的AMD依赖项.在我的项目中,我试图将我的代码保持为单个脚本标记,所以这不是理想的.
第二个问题是breezeJS无法加载淘汰赛.在我的main.js中,我已经为淘汰定义了一条路径:
knockout: '../libs/knockout/knockout-2.2.0',
(我这样做是因为我喜欢肯定我没有访问全局ko)
然而,当我为我的项目添加微风时,微风无法加载我的淘汰库.查看微风代码,我可以看到它已被硬编码加载淘汰库ko.
不想改变我的所有代码我发现我可以将我的AMD加载的淘汰库添加到全局窗口对象中window['ko'].但这感觉就像一个小屋.还奇怪地以这种方式添加Q并删除<script>标签不起作用,因为我认为Q在应用程序的生命周期中需要太早,甚至在我污染全局之前 - 我确实require()在main.js中嵌套我的调用但是隐藏了我的大部分应用程序文件来自构建过程,所以我放弃了这种方法.
我如何在我的项目中包含Q和knockout和breeze,并且仍然使用单行<script>标记,目前我不得不将Q作为单独的<script>标记包含并且污染全局以获得微风和淘汰赛以便很好地发挥作用.
我在我的项目中使用了很多其他库,但没有一个难以集成.
任何帮助深表感谢
干杯
GAV
编辑:这是我的完整需求配置:
require.config({
/**
* shims are for 3rd party libraries that have not been written in AMD format.
* shims define AMD modules definitions that get created at runtime.
*/
shim: {
'jqueryUI': { deps: ['jquery'] },
'jqueryAnimateEnhanced': { deps: ['jqueryUI'] },
'jqueryScrollTo': { deps: ['jquery'] },
'touchPunch': { …Run Code Online (Sandbox Code Playgroud) 我正在寻找支持动态代码加载的AMD加载器,这非常小.
加载器将在移动/高延迟环境中使用,并且requirejs的大小过多.
我不需要:
-text插件
-CSS插件
-i18n插件
支持这些功能的最小AMD加载器是什么?我正在寻找一些理想情况下缩小时不超过5k的东西.Gzip不包含在此度量中.
我的requirejs优化器遇到了一些麻烦.运行优化器后,我在构建/编译文件中收到一些错误消息.在没有优化步骤的情况下运行我的Web应用程序时,我没有任何错误.
这是我的client.js文件(包含配置)(coffeescript)
requirejs.config
baseUrl: '/source/'
paths:
text: 'lib/text'
io: 'lib/socket.io'
underscore: 'lib/underscore'
backbone: 'lib/backbone'
jquery: 'lib/jquery'
# almond: 'lib/almond'
bootstrap: 'lib/bootstrap'
bootstrapFileUpload: 'lib/bootstrap-fileupload'
jqueryUniform: 'lib/jquery.uniform'
jqueryBrowser: 'lib/jquery.browser'
datatables: 'lib/jquery.dataTables'
datatables_bootstrap: 'lib/DT_bootstrap'
shim:
io:
exports: 'io'
jquery:
exports: 'jQuery'
jqueryBrowser:
deps: ['jquery']
jqueryUniform:
deps: ['jqueryBrowser', 'jquery']
underscore:
exports: '_'
backbone:
deps: ['underscore', 'jquery']
exports: 'Backbone'
datatables_bootstrap:
deps: ['jquery', 'datatables']
datatables:
deps: ['jquery']
require ['routers/router', 'backbone'], (Router, Backbone) ->
MainRouter = new Router()
Backbone.history.start()
Run Code Online (Sandbox Code Playgroud)
这是我的优化器配置.在将'requirejs'作为模块后,我从nodejs运行优化器.
config =
baseUrl: __dirname + '/../client/source'
name: …Run Code Online (Sandbox Code Playgroud) 我有一些代码支持编写微库并将其加载到Dojo AMD,NodeJS require()和浏览器普通窗口.[某事] ......但我想知道是否已经建立了这样做的方法和我只是重新发明了轮子或代码是否值得.我确实在互联网上做了很好的搜索.
我创建的代码是https://gist.github.com/forbesmyester/5293746,如果人们有评论,很好,但我更感兴趣的是找出是否有适当的方法来做到这一点.
我正在开发一个JavaScript重的Web应用程序; 如果没有JavaScript,整个应用程序都是无用的.我目前正在使用requirejs作为我的模块加载器,以及将r.js我的JS优化为生产中的单个文件的工具.
目前,在生产中我的标记看起来像这样;
<script src="/js/require.js"></script>
<script>
require.config({
// blah blah blah
});
require(['editor']); // Bootstrap the JavaScript code.
</script>
Run Code Online (Sandbox Code Playgroud)
但是,这会异步加载JavaScript,这会使页面呈现尽管在加载JavaScript之前无法使用; 我没有看到这一点.相反,我想像这样同步加载JavaScript ;
<script src="/js/bundle.js"></script><!-- combine require.js, config and editor.js -->
Run Code Online (Sandbox Code Playgroud)
这样,当呈现页面时,它是可用的.我已经读过所有现代浏览器都支持并行加载,这使我相信互联网上的大多数建议都建议避免这种方法,因为它阻止并行下载已经过时了.
然而;
在开发中,我想将未组合的文件作为多个脚本标签插入,而不是单个缩小的文件;
<script src="/js/require.js"></script>
<script>/* require.config(...); */</script>
<script src="/js/editor-dep-1.js"></script>
<script src="/js/editor-dep-2.js"></script>
<script src="/js/editor.js"></script>
Run Code Online (Sandbox Code Playgroud)
...但是这在requirejs中显得非常繁琐(使用r.js生成虚假构建,获取依赖项的列表editor.js),感觉不对.
因此,我的问题如下;
<script />建议过时?我研究是否有检测,这是一种肯定,无论是给定的脚本目前正在RequireJS加载.一般来说AMD模块的答案会更好,但我的用例只是RequireJS.
jQuery和其他库"检测"它是这样的:
if ( typeof define === "function" && define.amd ) {
define( "jquery", [], function() {
return jQuery;
});
}
Run Code Online (Sandbox Code Playgroud)
在大多数情况下这已足够,但问题是它不会检测脚本是否作为AMD模块加载,它只检测是否define存在并支持AMD规范.
是否有一种方法,无论是使用RequireJS还是通常使用AMD模块,脚本都可以确定(实际上)它是否作为模块加载?
我正在使用安装了更新4和Typescript 1.3的Visual Studio 2013.
如果我有一个打字稿文件,如下所示:
MyEnums.ts:
export = MyEnumModule;
module MyEnumModule {
export enum AnEnum { RED, BLUE, GREEN }
}
Run Code Online (Sandbox Code Playgroud)
我有一个像这样的定义文件:
MyDefinitions.d.ts:
declare module MyDefinitions {
interface ISomeInterface {
aProperty: string;
aMethod: () => void;
aColor: MyEnumModule.AnEnum;
}
}
Run Code Online (Sandbox Code Playgroud)
我基本上得到一个错误"找不到名字'MyEnumModule'"
从typescript文件引用时,此枚举文件可正常工作.例如:
SomeCode.ts:
export = MyCode;
import MyEnums = require('MyEnums');
module MyCode{
export class MyClass implements ISomeInterface {
public aColor: MyEnums.AnEnum = MyEnums.AnEnum.RED;
...and so on
Run Code Online (Sandbox Code Playgroud)
我的理解是添加/// <reference...或导入将不适用于.d.ts文件(我试图确保它看起来无论如何都不起作用).
有谁知道如何在这样的定义文件中引用枚举?
提前致谢.
--update:
这是我在尝试下面的Steve Fenton建议后看到的错误(我刚刚制作了一个示例项目).
MyDefinitions.ts:
import MyEnumModule = …Run Code Online (Sandbox Code Playgroud) 将TypeScript与SystemJS一起使用,如何使用?导入JSON文件plugin-json?
如果我写,System.import('myjson.json!json').then(...)那么它会异步导入它,而不是作为其一部分System.register([...]).
那么,我如何导入JSON文件作为一部分System.register([...])并说服TypeScript同意这一点?(没有then Promise语法).
注意:
我正在使用tsc旗帜-m system
一个可能的解决方案是使用-m umd选项tsc代替-m system,然后我可以执行以下操作:
/// <reference path="typings/requirejs/require.d.ts" />
var myJson = require('myJson.json!json')
Run Code Online (Sandbox Code Playgroud)
但是,仍在等待有关使用的答案-m system.
我有一个现有的应用程序,我使用RequireJS定义AMD模块.我在我的项目中广泛使用了"text"和"i18n"插件for requirejs.我最近一直在试验ES6模块,并希望在我的应用程序中创建新模块时使用它们.但是,我想重用现有的AMD模块并在定义我的ES6模块时导入它们.
这甚至可能吗?我知道Traceur和Babel可以从ES6模块创建AMD模块,但这仅适用于不依赖于现有AMD模块的新模块,但我找不到重用现有AMD模块的示例.
任何帮助将不胜感激.这对我来说是一个阻止我开始使用所有ES6好东西.
谢谢
amd ×10
javascript ×8
requirejs ×8
module ×2
node.js ×2
typescript ×2
breeze ×1
coffeescript ×1
dojo ×1
ecmascript-6 ×1
enums ×1
js-amd ×1
knockout.js ×1
loader ×1
systemjs ×1