Понимание r.js, миндаля и относительных путей
Я вижу этот ответ, но AFAICT это не работает для меня. Может быть, я делаю что-то глупое.
Я использую миндаль и https://github.com/gruntjs/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) {
...
});
Другими словами, идентификатор, сгенерированный r.js src/lib
не соответствует идентификатору, на который ссылается 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, если вы хотите работать с ним.
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",
},
},
},