我有一个大型单页应用程序,我正在迁移到Dojo 1.7/AMD加载器语法.
我有一个主要的JSP加载所有内容,然后是一个用于动态内容生成的大量JSP页面.
在整个应用程序或每个必需模块的实例周围添加require(){}块是否是更好的设计决策?
还是一些组合?将最常见的require()添加到主页面,然后查找需要包装的其他实例?
出于某些奇怪的原因,Angular JS拥有自己的模块系统,既不是AMD也不是CommonJS.
我有许多AMD格式的现有模块.我想在Angular应用程序中使用它们.
我想避免重写任何AMD模块.如果可能的话,我也想避免使用Angular自己的模块系统.
使用Angular时是否可以使用AMD模块?是否可以避免Angular的自定义模块系统?
我有一组使用浏览器端但使用mocha测试服务器端的对象.我正在使用require.js进行AMD加载.Require.js站点建议在服务器端使用amdefine来获取定义的模块在node.js中使用这段代码:
if (typeof define !== 'function') {
var define = require('amdefine')(module)
}
Run Code Online (Sandbox Code Playgroud)
好.但我必须把它放到我想在Node中使用的每个模块中.在我的情况下,这意味着我必须将其从我使用客户端(大部分)的任何代码中删除.
我想知道是否有任何方法可以将这一大块代码放入我的测试中,这样我就不必将它放在我的客户端代码中.在我的文件中只有测试所需的代码似乎很愚蠢 - 将它放在测试代码中更有意义.但是,当我这样做时,我收到一个错误:
Error: amdefine with no module ID cannot be called more than once per file.
at runFactory (/home/vmplanet/dev/alpha/web/node_modules/amdefine/amdefine.js:159:23)
at define (/home/vmplanet/dev/alpha/web/node_modules/amdefine/amdefine.js:275:13)
at Object.<anonymous> (/home/vmplanet/dev/alpha/web/assets/src/coffee/delta/dataLayer.coffee:4:3)
at Object.<anonymous> (/home/vmplanet/dev/alpha/web/assets/src/coffee/delta/dataLayer.coffee:158:4)
at Module._compile (module.js:456:26)
at Object.loadFile (/usr/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:179:19)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
Run Code Online (Sandbox Code Playgroud)
这是一个奇怪的错误,因为amdefine代码只在一个地方 - 测试文件的顶部.有没有办法把这个amdefine代码放在我的测试中,只有我的测试,仍然可以让测试运行服务器端 - 而不必去除客户端的amdefine代码?
我正在维护和扩展一个AMD之前的旧项目.我想在应用程序中添加一个图表.为此,我创建了一个js文件,如下所示:
define(["dojox/charting/Chart",...."dijit/Dialog","dojo/dom-construct"],
function (Chart) {
function showDailyChart(data){
//code to show the chart in a dialog
}
return customModules.singleChart;
});
Run Code Online (Sandbox Code Playgroud)
我已将此文件另存为 /customModules/singleChart.js
在我的主HTML页面中,我已将其添加到包中,如下所示:
var dojoConfig = { parseOnLoad: true,
packages: [....,{"name":"customModules",
"location":location.pathname.replace(/\/[^/]+$/, "")+"/modules" }
]};
Run Code Online (Sandbox Code Playgroud)
我想称之为的功能是AMD之前的功能.所以我称之为:
dojo.require("customModules.singleChart");
.
.
.
customModules.singleChart.showDailyChart(data);
Run Code Online (Sandbox Code Playgroud)
我可以看到它/customModules/singleChart.js在Firebug控制台和Net Tab中加载.但是没有任何customModules.singleChart对象.奇怪的是,也没有错误.我在Firebug中测试了这个,以及谷歌Chrome的开发者工具.
使用AMD模块的正确方法是什么dojo.require?或者有更好的方法来做我需要的吗?
有没有办法避免加载已存在于DOM中的模块?
例:
require.config({
paths: {
// jquery here is needed only if window.jQuery is undefined
'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min'
}
});
Run Code Online (Sandbox Code Playgroud)
能够使用这个片段之类的东西会很棒
require.config({
paths: {
'jquery': {
uri: '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min',
// if this function returns false or undefined load the script from the url
define: function(){ return window.jQuery; }
}
}
});
Run Code Online (Sandbox Code Playgroud)
UPDATE
我和我的提议在github https://github.com/jrburke/requirejs/issues/886上向@jrburke发送了拉取请求.requirejs的固定版本可以在这里测试:
http://gianlucaguarini.com/experiments/requirejs/requirejs-test3.html
这里根据我的API提议配置requirejs
require.config({
paths: {
// jquery here is needed only if window.jQuery is undefined
'jquery':'//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min',
'lodash':'//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.0.0/lodash.underscore.min',
'backbone':'//cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min'
},
shim:{
'jquery':{
// with …Run Code Online (Sandbox Code Playgroud) RequireJS脚本标记应该位于<head>HTML页面的底部还是底部?
<script data-main="resources/js/main" src="require.js"></script>
Run Code Online (Sandbox Code Playgroud)
我见过有信誉的来源将RequireJS脚本标记放在任何一个位置,但没有信誉良好的来源似乎明确说明理想位置在哪里.
将标记放在头部的参数是,在页面继续加载时,RequireJS可能已经开始异步加载和执行依赖脚本(尽管这种增益可能微不足道).
将标记放置在页面底部的参数将是在模块内不需要检查准备好的DOM(但如果在加载模块的第三方系统中使用该模块,则不包括此检查可能会导致问题<head>标签中的脚本).
我正试图找到一种使用JSDoc3记录AMD模块的方法.
/**
* Module description.
*
* @module path/to/module
*/
define(['jquery', 'underscore'], function (jQuery, _) {
/**
* @param {string} foo Foo-Description
* @param {object} bar Bar-Description
*/
return function (foo, bar) {
// insert code here
};
});
Run Code Online (Sandbox Code Playgroud)
可悲的是,http://usejsdoc.org/howto-commonjs-modules.html上列出的模式都不适用于我.
如何生成一个适当的文档,列出模块导出的函数的参数和返回值?
有gulp-requirejs插件,但它被列入黑名单,并显示以下消息:" 直接使用require.js模块".
文档非常稀疏,我如何最好地将它与Gulp构建任务结合使用?
在文档中有一个例子:
var requirejs = require('requirejs');
var config = {
baseUrl: '../appDir/scripts',
name: 'main',
out: '../build/main-built.js'
};
requirejs.optimize(config, function (buildResponse) {
//buildResponse is just a text output of the modules
//included. Load the built file for the contents.
//Use config.out to get the optimized file contents.
var contents = fs.readFileSync(config.out, 'utf8');
}, function(err) {
//optimization err callback
});
Run Code Online (Sandbox Code Playgroud)
但这对我没什么帮助......这是我最好的尝试:
var gulp = require('gulp'),
r = require('requirejs').optimize;
var config2 = { …Run Code Online (Sandbox Code Playgroud) 我在Web应用程序中有以下场景:
我有一些包含多个amd模块的外部js文件(它们是由typescript生成的,但我现在不想使用ts-loader).这些文件中的每一个都包含多个amd模块,例如:
define("Namespace/Module1", ["require", "exports"], function (require, exports) {
....
}
define("Namespace/Module2", ["require", "exports"], function (require, exports) {
....
}
Run Code Online (Sandbox Code Playgroud)
在我的主应用程序中,我使用这些文件请求导出的模块
var a = require("Namespace/Module1").
Run Code Online (Sandbox Code Playgroud)
我使用SystemJs直到现在,使用正确的配置,一切正常,但我想开始使用webpack进行捆绑,我不知道如何将这些文件添加为"require"依赖项.
我尝试在导入requireJS后将它们添加为脚本标记,但(当然),webpack加载程序使用自己的"require"加载程序,但它不起作用.
在webpack配置中使用externals使得webpack认为它们不是模块,而是全局变量,因此它从生成的bundle中排除require("aaa")并期望全局aaa变量
function(module, exports) {
module.exports = aaa;
}
Run Code Online (Sandbox Code Playgroud)
我如何告诉webpack,当他生成我的包时,他仍然应该使用require("命名空间/模块")但之前,在我的外部文件中调用所有" define "?
我希望我的解释是足够的,如果我做错了什么,如果我遵循不良做法,或者其他什么,请解释.
提前致谢
最近我更新了ATI驱动程序(Iam使用HD7970)到最新的驱动程序,我的一些OpenGL项目的objetcs停止工作.他们在nVidia最新驱动程序上工作的更多(在960米上测试).我应该知道ATI和nVidia渲染管道之间有什么区别吗?
附加信息:
当我尝试用三角形绘制时我什么都没看到,但是当我切换到GL_POINTS时,我看到绿点(碎片着色器的输出是纯绿色通道)正在按原样移动.这可能表明顶点着色器正在进行,因为正在发生MVP乘法.这些是具有一个大VBO的行星LOD对象,因此我使用一个函数来绑定所有缓冲区,而另一个函数用于绘制必要的高度图.VBO大小为128MB
初始化:
glGenBuffers(1, &VBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, VBO);
glBufferData(GL_SHADER_STORAGE_BUFFER, size * sizeof(vec4), NULL, GL_DYNAMIC_COPY);
glGenBuffers(1, &IndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexSize * sizeof(unsigned int), NULL, GL_DYNAMIC_DRAW);
glGenBuffers(1, &Normals);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, Normals);
glBufferData(GL_SHADER_STORAGE_BUFFER, size * sizeof(vec4), NULL, GL_DYNAMIC_COPY);
Run Code Online (Sandbox Code Playgroud)
通过polygonizator(计算着色器)填充VBO:
#version 430 core
layout( std430, binding=1 ) buffer ParamsBuffer
{
float size;
uint index;
int parentIndex;
uint textureSize;
vec4 upVector;
vec4 Position;
vec4 quadrant;
};
layout( std430, binding=2 ) buffer VertBuffer
{
vec4 VBO[ ];
};
layout( std430, binding=3 …Run Code Online (Sandbox Code Playgroud)