Javascript RequireJS优化器-仍在尝试从旧目录加载文件-w/Django

Javascript RequireJS优化器-仍在尝试从旧目录加载文件-w/Django,javascript,django,requirejs,Javascript,Django,Requirejs,需要一些关于requireJS优化器的帮助。 我的设置如下: 德扬戈 Django静态文件夹中的JS 文件夹结构 - dist - copy of /static/ after optimizer (dir) - django_app01 - django_app02 - django_app ... - static - bower_components - js 我在做什么: 在静态文件夹上运行r.js r、 js按预期选择文件并将其移动到“dist”文件夹 更

需要一些关于requireJS优化器的帮助。 我的设置如下:

  • 德扬戈
  • Django静态文件夹中的JS
文件夹结构

- dist
    - copy of /static/ after optimizer (dir)
- django_app01
- django_app02
- django_app ...
- static
    - bower_components
    - js
我在做什么:

  • 在静态文件夹上运行r.js
  • r、 js按预期选择文件并将其移动到“dist”文件夹
  • 更改Django中的“static_url”设置,以从“dist”文件夹获取静态文件
  • 加载页面并获取大量404,因为RequireJS仍在尝试从/static/获取模块
  • 下面是它试图获取的url的示例: localhost/static/。。。 而不是 localhost/dist/

    你知道我为什么在运行优化器后得到所有这些404吗。我希望r.js优化器开始查找/dist中的所有文件

    build.js:

    mainConfigFile : "static/js/require/common.js",
    baseUrl: "static",
    dir: "dist",
    removeCombined: false,
    findNestedDependencies: false,
    modules: [
      {
        name: "js/require/common"
      },
      ...
    ]
    
    mainConfigFile : "static/js/require/common.js",
    baseUrl: "static",
    dir: "dist",
    removeCombined: false,
    findNestedDependencies: false,
    modules: [
      {
        name: "js/require/common"
      },
      ...
    ]
    
    common.js:

    requirejs.config({
      baseUrl: '/static/',
      paths: {
        'jquery': 'bower_components/jquery/dist/jquery.min',
        ...
      },
      'shim': {
        'blah': {
          'deps': [...],
          'exports': 'blah'
        },
        ...
      }
    })
    
    requirejs.config({
      // baseUrl: '/static/', DO NOT DEFINE baseUrl here anymore
      paths: {
        'jquery': 'bower_components/jquery/dist/jquery.min',
        ...
      },
      'shim': {
        'blah': {
          'deps': [...],
          'exports': 'blah'
        },
        ...
      }
    })
    
    html:

    
    需要(['{%static“js/interfaces.js”%}']);
    
    根据您在问题中显示的内容判断,您在未优化文件时使用的运行时配置与优化后使用的配置相同。也就是说,您只有一个
    common.js
    文件为这两种情况设置运行时。此文件设置了
    /static/
    baseUrl
    ,因此RequireJS在这里查找文件。优化过程不会在幕后覆盖此设置

    对于我的一个项目,我所做的是将要优化的源代码放入一个只针对源代码的目录(
    static src
    )。Django对此目录一无所知。然后,当我运行
    make
    构建项目时,会发生以下两种情况之一:

  • 我创建了一个非优化构建,它将所有文件从
    static src
    复制到名为
    build/static build
    的目录中。(在
    build
    下还有其他用于其他目的的子目录

  • 我制作了一个优化的构建,运行
    r.js
    r.js
    将其输出放入
    build/static build

  • 在这两种情况下,所有内容都会在同一个位置结束。
    STATICFILES\u DIRS
    在我的
    settings
    中设置,以便在运行
    collectstatic
    时从该目录中获取文件。我的服务器设置为服务
    /static/
    static\u URL
    的值)来自
    collectstatic
    收集静态文件的位置的文件


    这只是一个例子。你可以使用
    make
    之外的其他东西。你当然可以使用不同的目录名。你可能有一个更简单的构建过程。(我在对Django非常陌生的时候创建了它,从来没有想过要修改它。)

    好的,我想知道如何在不使用监视程序、或
    制作
    或任何其他文件夹复制脚本的情况下执行此操作

    requireJS允许您在HTML顶部加载require.js库之前设置默认变量

    我对以前的配置所做的更改包括: -不再在模块定义中定义
    baseUrl
    requirejs.config
    ) -根据环境将
    baseUrl
    定义为默认值

    build.js:

    mainConfigFile : "static/js/require/common.js",
    baseUrl: "static",
    dir: "dist",
    removeCombined: false,
    findNestedDependencies: false,
    modules: [
      {
        name: "js/require/common"
      },
      ...
    ]
    
    mainConfigFile : "static/js/require/common.js",
    baseUrl: "static",
    dir: "dist",
    removeCombined: false,
    findNestedDependencies: false,
    modules: [
      {
        name: "js/require/common"
      },
      ...
    ]
    
    common.js:

    requirejs.config({
      baseUrl: '/static/',
      paths: {
        'jquery': 'bower_components/jquery/dist/jquery.min',
        ...
      },
      'shim': {
        'blah': {
          'deps': [...],
          'exports': 'blah'
        },
        ...
      }
    })
    
    requirejs.config({
      // baseUrl: '/static/', DO NOT DEFINE baseUrl here anymore
      paths: {
        'jquery': 'bower_components/jquery/dist/jquery.min',
        ...
      },
      'shim': {
        'blah': {
          'deps': [...],
          'exports': 'blah'
        },
        ...
      }
    })
    
    html:

    
    var require={
    baseUrl:{%if debug%}'/static/'{%else%}'/dist/'{%endif%}
    }
    需要(['{%static“js/interfaces.js”%}']);
    
    如果在本地主机上运行此操作,
    /cdn..
    不起作用-将其更改为
    http://cdn..
    我正在运行一个解析这些URL的本地服务器。我仔细检查了我的“网络”选项卡,这已得到正确解析。将在此处的注释中更新我的解决方案。我们没有使用
    make
    ,因此我们将e寻找一个不同的解决方案。感谢@Louis的帮助,你的回答让我找到了我自己的解决方案,我觉得效果更好。请参阅接受的答案。:)对任何给定项目来说,什么是最好的取决于项目。我确实需要一个构建过程,因为a)我的RequireJS运行时配置的其他部分根据构建条件而变化,b)其他文件在构建过程中需要处理。我也不想将是否使用优化版本与我是否处于调试模式(
    {%if debug%}
    )联系起来。是的,这是完全有意义的!我的项目设置稍有不同,此解决方案更适合它。我很高兴这个问题有两种解决方案。我广泛使用
    debug
    ,因此它更有意义。