我如何实例化不同页面上的 require.js 模块,带有代码点火器的部分


How do I instantiate require.js modules on different pages, partials with codeigniter?

我正在尝试在基于php/codeigniter的大规模网站上更新javascript。它有很多很多 php 部分,用于将代码加载到某些页面上,但只有一个页脚,即页眉。大多数部分都有内联脚本标签,用于加载javascript。这需要修复,并且由于该站点非常模块化,组件在页面上多次使用,因此需要.js似乎是一个很好的解决方案。

所以,它是实例化的javascript,我们通常这样做。

<script type="javascript" src="../js/scriptname.js">
<script type="javascript">
     DP.scriptname.init(parameters)
</script>

我想摆脱这种情况,只有一个使用 require 的 js 入口点。

我的问题是:使用 require 为某些页面实例化 javascript 的最佳方法是什么?我是否需要继续在部分中包含我的脚本,然后做一些事情,例如为该特定页面编写一个 require 模块,然后将其全部包装在我的数据主脚本中,如下所示?我们也计划使用Backbone和木偶,但我将无法使用Backbone路由器来做任何事情,比如设置哈希URL。我应该使用 URL 来实例化我的需求模块吗?

好的,希望有人能帮忙。我的经验通常是构建单页网站。这是不同的。谢谢

凸轮

好吧

,如果我正确理解您的问题,您可以以这种方式使用"需要JS"。

首先,编写一个配置,您可以在其中描述模块名称和具体文件之间的映射。例如:

requirejs.config({        
    baseUrl: 'js/modules' // by default load any module using this path
});

之后,您应该重构现有模块并将其调整为 AMD 格式(请参阅 http://requirejs.org/docs/whyamd.html)

作为此步骤的结果,您将得到类似以下内容(假设在文件'js/modules/scriptname.js'中):

// module has the same name as the file, which contains it - "scriptname"
define(function () {
    // define the module value by returning a value
    return function () {};
});

作为最后一步,您可以重构内联脚本并通过以下方式使用此模块:

<script type="javascript">
    // when we place name of the module as a first argument of the "define" 
    // function, Require JS find file that contains it and load it asynchronously
    define(["scriptname"], function (scriptname) {
        // "scriptname" now contains value that we recieve from the module definition
        scriptname.init(parameters);
    });
</script>

希望这有帮助。

注意。我的解决方案基于官方需要JS文档的这一部分:http://requirejs.org/docs/api.html#jsfiles

这个问题似乎经常出现,所以我会向你指出一些可能有帮助的资源:

  • RequireJS 如何处理多个页面和部分视图? - https://stackoverflow.com/a/10816983/617615
  • 带有 RequireJS 的模块化 HTML 组件 - http://simonsmith.io/modular-html-components-with-requirejs/
  • 示例基于 RequireJS 的项目,该项目具有共享一组通用模块的多个页面 - https://github.com/requirejs/example-multipage