Понимание r.js, миндаля и относительных путей

Я вижу этот ответ, но AFAICT это не работает на меня. Может быть, я делаю что-то глупое.

Я использую миндаль и grunt-contrib-requirejs. Я пробовал кучу вещей

Вот мой макет

.
├── Gruntfile.js
├── 3rdparty
│   ├── require.js
├── src
│   ├── lib.js
│   └── main.js
└── node_modules
    └── almond
        └── almond.js

А вот мой конфиг grunt-contrib-requirejs

requirejs: {
  full: {
    options: {
      baseUrl: "./",
      name: "node_modules/almond/almond.js",
      include: [ "src/main.js" ],
      out: "dist/app.js",
      optimize: "none",
    },
  },
},

main.js выглядит так

requirejs(['./lib',], function(lib) {
  lib.hello();
});

lib.js выглядит так

define([], function() {
    return {
      hello: function() {
          console.log("hello from lib");
      },
    };
});

Если запустить страницу, которая использует require.js, как в

<script src="3rdparty/require.js" data-main="src/main.js"></script>

Он отлично работает. Вы можете увидеть это вживую здесь. Проверьте консоль, и вы увидите, что она печатает hello from lib

Так что я бегу хрюкать. Затем я запускаю страницу, использующую dist/app.js, и получаю сообщение об ошибке

Uncaught Error: undefined missing lib

Вот действующая страница.

Проверка сгенерированного dist/app.js Я вижу, что библиотека была превращена в это

define('src/lib',[], function() {
   ...
});

И главное включить это вот так

requirejs(['./lib'], function(lib) {
  ...
});

Другими словами, идентификатор src/lib, сгенерированный r.js, не соответствует идентификатору, на который main ссылается ./lib.

Это кажется очень простым примером для r.js. Как практически "привет мир".

Что я делаю неправильно?

Я пробовал менять baseUrl на ./src.

requirejs: {
  full: {
    options: {
      baseUrl: "./src",
      name: "node_modules/almond/almond.js",
      include: [ "src/main.js" ],
      out: "dist/app.js",
      optimize: "none",
    },
  },
},

Но теперь я получаю

{ [Error: Error: ENOENT: no such file or directory, open '/Users/gregg/temp/grunt-contrib-requirejs-example/src/node_modules/almond/almond.js'
    at Error (native)
]
  originalError: 
   { [Error: ENOENT: no such file or directory, open '/Users/gregg/temp/grunt-contrib-requirejs-example/src/node_modules/almond/almond.js']
     errno: -2,
     code: 'ENOENT',
     syscall: 'open',
     path: '/Users/gregg/temp/grunt-contrib-requirejs-example/src/node_modules/almond/almond.js',
     fileName: '/Users/gregg/temp/grunt-contrib-requirejs-example/src/node_modules/almond/almond.js' } }

Поэтому я пытаюсь исправить миндальный путь

requirejs: {
  full: {
    options: {
      baseUrl: "./src",
      name: "../node_modules/almond/almond.js",
      include: "main",
      out: "dist/app.js",
      optimize: "none",
    },
  },
},

Но и это не удается

{ [Error: Error: ERROR: module path does not exist: ../node_modules/almond/almond.js for module named: ../node_modules/almond/almond.js. Path is relative to: /Users/gregg/temp/grunt-contrib-requirejs-example
    at /Users/gregg/temp/grunt-contrib-requirejs-example/node_modules/requirejs/bin/r.js:30214:35
]
  originalError: [Error: ERROR: module path does not exist: ../node_modules/almond/almond.js for module named: ../node_modules/almond/almond.js. Path is relative to: /Users/gregg/temp/grunt-contrib-requirejs-example] }

Что я не получаю?

Здесь все проверено на github, если вы хотите работать с Это.


person gman    schedule 14.02.2016    source источник


Ответы (1)


Итак, вот ответ.

r.js предпочитает имена модулей, а не пути

requirejs: {
  full: {
    options: {
      baseUrl: "./src",
      paths: {
        almond: "../node_modules/almond/almond",
      }
      name: "almond",
      include: [ "main.js" ],
      out: "dist/app.js",
      optimize: "none",
    },
  },
},
person gman    schedule 10.03.2016