使用 r.js 打包使用“文本”加载视图的 SPA 应用程序

2024-04-14

我正在尝试使用 grunt 将 SPA 应用程序(requirejs、durandal 2、knockout)构建到单个 main-build.js 文件中,并且我遇到了 durandal 用于加载我的“文本”插件的严重问题意见。

在开发中,我成功地使用“文本”按照构建 durandal 应用程序的标准方式动态加载视图。不同之处在于,我需要为视图做一些服务器端模板,因此它们实际上是动态生成的。

考虑到这一点,我想使用 r.js 将应用程序模型、视图模型和服务(通过 grunt-durandal 插件)打包到单个文件中,但不打包视图(.html)并仍然加载它们根据需要动态地。

在我的 grunt 配置中,我使用的是inlineText: false选项 - 我已经检查过正在抑制构建中的“text!*”模块。但是当我运行该应用程序时,我得到:

Uncaught TypeError: undefined is not a function从内部text.load在下面一行:

var parsed = text.parseName(name),
            nonStripName = parsed.moduleName +
                (parsed.ext ? '.' + parsed.ext : ''),
            url = req.toUrl(nonStripName), // EXCEPTION THROWN HERE

正在加载的模块名称似乎是正确的(它是“文本!*”),但除此之外,我不知道如何继续调试此问题。我究竟做错了什么?

我的咕噜配置是:

/*global module, require */

module.exports = function (grunt) {
'use strict';

// library that allows config objects to be merged together
var mixIn = require('mout/object/mixIn');

var requireConfig = {
    baseUrl: 'App/',
    paths: {
        'jquery': '../Scripts/jquery-2.1.0',
        'knockout': '../Scripts/knockout-3.1.0',
        'text': '../Scripts/text',
        'durandal': '../Scripts/durandal',
        'plugins': '../Scripts/durandal/plugins',
        'transitions': '../Scripts/durandal/transitions',
    }
};

grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    jshint: {
        options: {
            "-W099": true, // allowed mixed tabs and spaces
            "-W004": true, // needed to avoid errors where TS fakes inheritance
            ignores: [
                'App/main-built.js' // ingore the built/compacted file
            ]
        },
        all: [ // run jshint on these files
            'gruntfile.js',
            'App/**/*.js'
        ]
    },
    // TODO: could add jasmine here to do JS testing
    clean: {
        build: ['build/*']
    },
    copy: {
        scripts: {
            src: 'Scripts/**/**',
            dest: 'build/'
        }
    },
    durandal: {
        main: {
            src: [
                'App/**/*.*',
                '!App/main-built.js', // ignore the built file!
                'Scripts/durandal/**/*.js'
            ],
            options: {
                name: '../Scripts/almond-custom',
                baseUrl: requireConfig.baseUrl,
                mainPath: 'App/main',
                paths: mixIn(
                    {},
                    requireConfig.paths,
                    { 'almond': '../Scripts/almond-custom.js' }),
                exclude: [],
                inlineText: false, // prevent bundling of .html (since we are dynamically generating these for content)
                optimize: 'none', // turn off optimisations - uglify will run seperately by grunt to do this
                out: 'build/app/main-built.js'
            }
        }
    },
    uglify: {
        options: {
            banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> \n' +
                '* Copyright (c) <%= grunt.template.today("yyyy") %> Kieran Benton \n' +
                '*/\n'
        },
        build: {
            src: 'build/App/main.js',
            dest: 'build/App/main-built.js'
        }
    }
}
);

// loading plugin(s)
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-jasmine');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-open');
grunt.loadNpmTasks('grunt-durandal');

// only one grunt task
grunt.registerTask('build', [
    'jshint',
    'clean',
    'copy',
    'durandal:main']);
};

Almond 不支持动态加载。它没有实现require.toUrl并且不支持异步加载器插件。 RequireJS 和 Almond 的创建者 James Burke 回答了同样的问题here https://github.com/jrburke/almond/issues/50.

要解决此问题,您可以将 RequireJS 而不是 Almond 包含到捆绑包中。看一个例子here http://requirejs.org/docs/optimization.html#onejs。您必须为以下对象创建一个别名require.js in the pathsr.js 配置部分为require是一个特殊的保留依赖名称。然后,在name配置字段而不是杏仁。你会得到这样的东西:

options: {
    name: 'requireLib', // use the alias
    baseUrl: requireConfig.baseUrl,
    mainPath: 'App/main',
    paths: mixIn(
        {},
        requireConfig.paths,
        { 'requireLib': '../Scripts/require.js' }), // declare the alias
    exclude: [],
    inlineText: false,
    optimize: 'none',
    out: 'build/app/main-built.js'
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 r.js 打包使用“文本”加载视图的 SPA 应用程序 的相关文章

随机推荐

  • SQL 存储过程 IF EXISTS UPDATE ELSE INSERT

    好的 我得到了很多帮助here https stackoverflow com questions 11906506 sql server 2008 if not exists insert else update之前使用 SQL 后端来实
  • 添加始终显示在屏幕底部的页脚?

    即使页面内容非常小 如何添加始终位于屏幕底部的页脚 例如 假设我有一个页面没有显示太多内容 因此页脚位于屏幕中间 我能否确保如果页面内容不多 则页脚位于屏幕底部 UPDATE 我只想要一个位于屏幕底部的页脚 当没有足够的内容来填充整个屏幕时
  • 如果A、B、C上有索引,A、B上的索引是否多余?

    拥有多年的 DBA 经验 我确实相信我知道问题的答案 但我认为检查一下我的基础总没有坏处 使用 SQL Server 假设我有一个在列上有索引的表A和列B 以及列上的第二个索引A B and C 删除第一个索引是否安全 因为第二个索引基本上
  • 64 位 delphi 应用程序中的 {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

    Does SetPEFlags IMAGE FILE LARGE ADDRESS AWARE 对64位delphi应用程序有什么影响吗 它根本没有任何作用 所有 64 位进程都会自动判定为大地址感知
  • 使用新的 gradle 插件发布到 Sonatype:maven-publish

    到目前为止 我正在使用 Gradle 将 java 工件上传到 Sonar Nexusupload任务 例如 https github com oblac jodd blob master gradle publish maven grad
  • 有没有办法在 occi 中预取 LOB 数据?

    我正在开发一个以 Oracle 作为数据库的 C 应用程序 并尝试使用 CLOB 数据类型获取数千条记录 一直在网上搜索如何在 OCCI 中预取 CLOB 数据类型 但总是看到 如果 LONG LOB 或不透明类型列 例如 XMLType
  • Firebase:将 Facebook 帐户与现有用户关联

    我在 Firebase 中有一个当前数据库 其中包含可以使用 user pwd 登录的活动用户 但现在我正在实现 facebook 登录 并且我意识到将 facebook 帐户与现有用户链接的唯一方法只有当用户已经登录时用户 密码 但不是在
  • 如何调用 MemberwiseClone()?

    我对如何使用感到困惑MemberwiseClone 方法 我在 MSDN 中查看了示例 他们通过this关键词 为什么我不能像其他对象的方法一样直接调用它GetType or ToString 另外一个没有出现的相关方法是ShallowCo
  • 如何使用 Chrome 和 FireFox JAVA 的 webdriver 禁用 cookie

    我想启动浏览器 FF CHROME 以禁用 cookie 进行测试 我尝试了以下方法 service new ChromeDriverService Builder usingDriverExecutable new File src te
  • Postgres JDBC 驱动程序:PSQLException:返回时或附近出现语法错误

    由于某种原因 JDBC PostgreSQL 驱动程序正在添加 返回 到 select 语句的末尾 为什么 Code protected static final String AUTH QUERY SELECT SECRET FROM u
  • 未重定向到 Codeigniter 4 中的特定 URL

    为什么每当我通过 Codeigniter 4 控制器的构造函数重定向某些内容时就不起作用
  • 在php中获取今天和昨天的时间戳

    如何使用php中的strtotime 函数获取今天 昨天和前天12点的时间戳 12 点钟是一个变量 可以由用户更改 hour 12 today strtotime hour 00 00 yesterday strtotime 1 day t
  • 我可以在 Visual Studio (c++) 中设置断点以在线程上下文切换时中断吗?

    我们只想打破某个线程 知道该怎么做吗 我似乎找不到打破这个条件的方法 我应该在文字中更具体 正如标题所示 我想中断上下文切换到线程中 您需要设置断点过滤器 右键单击断点并选择 Filter 选项 它将显示一个对话框 允许您将断点过滤到特定的
  • 在覆盖 ProcessCmdKey EventHandler 时跳过 KeyDown

    我通过按向下箭头键在文本框上进行了简单的增量 如下所示 protected override bool ProcessCmdKey ref Message msg Keys keyData if keyData Keys Down int
  • CLLocationManager 坐标

    我一直致力于实现步行 骑自行车和开车的路线跟踪图 然而 正如您在下面的屏幕截图中看到的那样 即使我没有步行 骑自行车或开车前往该位置 我的坐标也会时不时地突然跳跃 在图像上画了圆圈来指出问题 我的问题是为什么坐标突然跳跃 这是我的实施快照
  • IP_RECVERR 的 OSX 等效项

    我正在尝试将 TraceRoute 程序从 Linux 移植到 OSX 但在找到 IP RECVERR 等效项时遇到问题 大多数人进行数据包解析的方式是 setsockopt sock IPPROTO IPV4 IP RECVERR on
  • 车把中的“{{{variable}}}”是什么意思?

    三重花括号在车把模板语法中意味着什么 例如 variable 我找不到任何文档 Thanks 因为它最初设计用于生成 HTML 所以 Handlebars 转义了由 expression 如果您不希望 Handlebars 转义值 请使用
  • Memcached 与 Windows 和 .NET

    有没有人已经在 Windows 环境中实现了 memcached 以供生产使用 因为我读过很多博客 不建议在 Windows 中运行 memcached 尤其是用于生产用途 例如在 Windows 上运行 memcached http la
  • 如何将 Citrix 中的 C# 程序实例限制为每用户 1 个

    我有一个带有 C 代码的 Windows 窗体应用程序 如下所示 针对 NET Framework 4 在我的开发人员工作站上 此代码可以阻止我启动该程序的多个实例 但是 QA 有一个 Citrix 测试环境 每个用户仍然能够启动多个实例
  • 使用 r.js 打包使用“文本”加载视图的 SPA 应用程序

    我正在尝试使用 grunt 将 SPA 应用程序 requirejs durandal 2 knockout 构建到单个 main build js 文件中 并且我遇到了 durandal 用于加载我的 文本 插件的严重问题意见 在开发中