使用grunt-contrib-requirejs任务优化我的require.js项目时,由于相对路径,需要多次脚本多次。 以下是构建期间输出的依赖项列表:

components/requirejs/require.js
.tmp/scripts/../../components/flight/lib/././utils.js
.tmp/scripts/../../components/flight/lib/./././utils.js
.tmp/scripts/../../components/flight/lib/././../tools/debug/../../lib/./utils.js
.tmp/scripts/../../components/flight/lib/././../tools/debug/../../lib/registry.js
.tmp/scripts/../../components/flight/lib/././../tools/debug/../../lib/utils.js
.tmp/scripts/../../components/flight/lib/././../tools/debug/debug.js
.tmp/scripts/../../components/flight/lib/././compose.js
.tmp/scripts/../../components/flight/lib/./advice.js
.tmp/scripts/../../components/flight/lib/./utils.js
.tmp/scripts/../../components/flight/lib/./../tools/debug/../../lib/./utils.js
.tmp/scripts/../../components/flight/lib/./../tools/debug/../../lib/registry.js
.tmp/scripts/../../components/flight/lib/./../tools/debug/../../lib/utils.js
.tmp/scripts/../../components/flight/lib/./../tools/debug/debug.js
.tmp/scripts/../../components/flight/lib/./compose.js
.tmp/scripts/../../components/flight/lib/./registry.js
.tmp/scripts/../../components/flight/lib/component.js

请注意utils.js如何被包含7次:

.tmp/scripts/../../components/flight/lib/./utils.js
.tmp/scripts/../../components/flight/lib/././utils.js
.tmp/scripts/../../components/flight/lib/./././utils.js
.tmp/scripts/../../components/flight/lib/./../tools/debug/../../lib/utils.js
.tmp/scripts/../../components/flight/lib/./../tools/debug/../../lib/./utils.js
.tmp/scripts/../../components/flight/lib/././../tools/debug/../../lib/utils.js
.tmp/scripts/../../components/flight/lib/././../tools/debug/../../lib/./utils.js

飞行需要utils.js在他们每个脚本lib与路径./util ,有时需要其他的依赖关系则需要./util一次。

grunt-contrib-requirejs将它们的选项直接传递给requirejs ,其中包括一个函数trimDots ,它应该“修剪”路径段数组中的。和..“。

为什么不照顾一些明显的重复?

我该怎么做才能消除相对路径等于相同绝对路径的其他重复项?

如果相对路径将标准化为绝对路径,则一切都会很好。

更新:

这就是我的项目结构:

.tmp/scripts/ (where coffeescript is compiled)
app/scripts/ (coffeescript source)
components/ (bower components)
dist/ (where optimized code is output)
Gruntfile.coffee (requirejs config)

这是我的Gruntfile中的requirejs配置:

requirejs:
  dist:
    options:
      baseUrl: '.tmp/scripts'
      # paths relative to baseUrl
      paths:
        requireLib: '../../components/requirejs/require'
      include: 'requireLib'
      optimize: 'uglify2'
      generateSourceMaps: true
      preserveLicenseComments: false
      useStrict: true
      wrap: true
      name: 'main'
      out: 'dist/main.js'
      mainConfigFile: '.tmp/scripts/main.js'

以下是app/scripts/main.coffee

require.config
  paths:
    # required dependencies
    jquery: '../../components/jquery/jquery'
    es5shim: '../../components/es5-shim/es5-shim'
    es5sham: '../../components/es5-shim/es5-sham'
    # plugins
    text: '../../components/requirejs-text/text'
    pickadate: '../../components/pickadate/source/pickadate.legacy'
  map:
    '*':
      'flight/component': '../../components/flight/lib/component'
  shim:
    '../../components/flight/lib/index':
      deps: ['jquery', 'es5shim', 'es5sham']
    'app':
      deps: ['../../components/flight/lib/index']

require ['app'], (App) ->
  App.initialize()

以下是app/scripts/app.coffee

define [
  'ui/apple',
  'ui/orange'
], (Apple, Orange) ->
  initialize = ->
    Apple.attachTo document
    Orange.attachTo document
    return

  initialize: initialize

app/scripts/ui/apple.coffeeapp/scripts/ui/orange.coffee都是:

"use strict"
define ['flight/component'], (defineComponent) ->
  apple = ->
    # stuff
  defineComponent apple

===============>>#1 票数:0

尝试在grunt-contrib-requirejs选项中设置baseUrl:

requirejs: {
    compile: {
        options: {
            baseUrl: "path/to/base"
        }
    }
}

记录在这里

===============>>#2 票数:0

我看到你的代码中的一些东西引起了问题。 我知道这个问题是在三年前提出的,所以其中一些问题可能不适用于当时。 但我回过头来看看3年前的航班代码,然后回答。

  1. 为什么要为grunt插件提供requireLib 您不应该这样做,因为grunt插件应该加载它自己的。 结果将是两个需要libs加载,这只是令人困惑。

  2. Shim配置仅适用于非AMD模块 ,但是您要同时填充“app”和“index”,它们都是AMD模块。 我会期待一些奇怪的行为。

  3. 为了修复#2并使代码更简单,您可以完全删除垫片并简单地映射相关的所有“飞行”:

     # main.coffee require.config paths: # required dependencies jquery: '../../components/jquery/jquery' es5shim: '../../components/es5-shim/es5-shim' es5sham: '../../components/es5-shim/es5-sham' # plugins text: '../../components/requirejs-text/text' pickadate: '../../components/pickadate/source/pickadate.legacy' map '*': 'flight': '../../components/flight/lib' require ['jquery', 'es5shim', 'es5sham'], (App) -> require ['app'], (App) -> App.initialize() # app.coffee define [ 'flight/index', 'ui/apple', 'ui/orange' ], (Apple, Orange) -> initialize = -> Apple.attachTo document Orange.attachTo document return initialize: initialize 

我不确定这是否能解决您的问题,所以如果您可以上传一个带有相关代码的小型zip文件,这将有很大帮助。

  ask by maxbeatty translate from so

未解决问题?本站智能推荐:

1回复

需要js优化器相对路径问题

我正在尝试做需求优化器的浏览器示例 。我有这样的文件夹结构,并且r.js和build.html与js文件夹处于同一级别 在main.js中,我已经指定了这样的路径 即时消息包括模块中的脚本 和我的build.htnl具有这样的配置 但它没有建立,我可以看到1,2,
1回复

从优化的应用中消除对require js的需求

我已经使用require.js构建了我的应用程序,以使所有模块保持模块化。 完成后,事实证明require.js本身比我优化的应用程序代码更大。 有什么方法可以使r.js进行优化,而无需在最后一页中包含require.js(例如,用命名空间对象上的属性的直接定义替换所有我的define调用,
1回复

在节点中使用串联的简单JS需求/包含/导入工具

我正在为节点中的JavaScript寻找一个简单的JavaScript require / concat工具。 例如,假设我有4个JS文件: each.js on.js onEach.js all.js 最后两个文件具有依赖性。 我想知道是否存在一个
1回复

RequireJS,Jasmine和Grunt错误:scripterror:非法路径或脚本错误

我有一个使用requireJS的应用程序,我想使用grunt-contrib-jasmie对其进行测试。 为了使茉莉花能够正常工作,我正在使用cloudchen的grunt-template-jasmine-requirejs。 该应用程序具有以下目录结构: app.js是我的req
1回复

如何在构建脚本中将CDN URL前缀为requirejs路径

鉴于此requirejs配置: 我希望我的自动化脚本为生产准备一个包,以将paths对象内部的每个值映射为以下内容: 如您所见, cdnUrl是一个实际变量,它将在运行时保存CDN端点。 该脚本应在何时构建时无法确定端点。 如何进行这种映射? 编辑: 我不想在
2回复

RrequireJS优化器并在优化后加载动态路径

我的requirejs任务艰巨,正在运行优化程序。 我加载了很多外部文件,这些文件在运行时并不总是需要的,通常我只需要几个核心文件。 然后根据用户的决定,我会在运行时加载某些文件。 例如: json的文件路径可能如下所示: 问题是这不适用于我的优化程序。 当我
1回复

grunt requirejs忽略来自mainConfigFile的路径

项目介绍 我的项目是单页店面。 该项目有多个模块,每个模块包含一组controller.js,view.js和model.js文件,以及template.html文件。 并使用requirejs来管理依赖项。 问题陈述 我想使用mainConfigFile来提供grunt-
1回复

卡在requirejs与Grunt-contrib-requirejs的相对路径配置中

我在引用代码中具有相对路径的requirejs模块时遇到了麻烦,并使它们与grunt-contrib-requirejs一起使用。 任何人都知道为什么会发生这种情况吗? 档案结构: Requirejs配置: GruntFile: 在project.js文件中,我将
1回复

r.js优化需求调用

我有一个配置文件,其中包含指向主干视图的列表路径 配置文件通过ajax加载,然后根据指定的页面进行加载,然后循环运行一堆require调用以加载所需的文件。 我想通过grunt require optimiser来运行此程序,并将所有文件优化为一个build.js文件。 来自d
1回复

Grunt保持错误,“模块路径不存在”

我正试图在新机器上运行grunt,它不会编译。 我收到的错误是: 我运行sudo npm install -g bower-installer和sudo npm install -g bower只是为了确保我没有错过这台机器上的任何软件包。 仍然没有运气。 我的grunt文