Javascript RequireJS如何决定运行什么和加载什么?

Javascript RequireJS如何决定运行什么和加载什么?,javascript,ember.js,requirejs,Javascript,Ember.js,Requirejs,我正在使用RequireJS 在我的routes.coffee文件中,我正在定义我的路由: define ['jquery' 'ember' '_' 'cs!myapp/myapp' "cs!myapp/routes/index_route" ], ($, Ember, _, MyApp, IndexRoute) -> alert "Inside myapp route" MyApp.Route

我正在使用
RequireJS

在我的
routes.coffee
文件中,我正在定义我的路由:

define ['jquery'
        'ember'
        '_'
        'cs!myapp/myapp'
        "cs!myapp/routes/index_route"
        ], ($, Ember, _, MyApp, IndexRoute) ->
    alert "Inside myapp route"
    MyApp.Router.map () ->
        @resource "play", path: '/play', () ->
            @resource "myapp", {}, () ->
                @resource "games", {}, () ->
                    @route "next"
                    @resource "frames", {}, () ->
                        @route "commercial"
                    @resource "trivia", {}, () ->
                        @route "commercial"
                @route "start"
                @route "howItWorks"
                @route "goodbye"
        @route "readyToStart"
        @route "noContent"

    MyApp.IndexRoute = IndexRoute

具体地说,据我理解,这是一个
定义
而不是
要求
,因此它不应该执行该代码。但是警报响了。那么发生了什么呢?

确实,您在回答中显示的
定义
不会立即调用您赋予它的工厂函数。(factory函数是您给
define
的回调)但是,
routes.coffee
中的
警报将在需要
routes.coffee
时立即调用。如果
require
调用或
define
调用的依赖项列表中出现
routes.coffee
模块,则该模块是必需的


请注意,可能需要一个模块而不使用它。RequireJS不关心模块是否被使用。它只关心需要一个模块。因此,像
require(['foo'])
这样的调用将要求调用模块
foo
,并导致调用其工厂函数,即使它未在该
require
调用中使用。

My
routes.coffee
用于
main.coffee的
define
,那么,这是否意味着它只是在
定义中运行?是的。当RequireJS加载
main.coffee
时,它读取传递给
define
调用的依赖项列表,您说该调用包含
routes.coffee
,因此它加载
routes.coffee
,从而调用其工厂函数并发出
警报。但是,
routes.coffee
中的
define
调用不会导致执行自己的工厂功能。
define
的工厂功能总是由另一个
define
require
调用执行。