2016-04-20 1 views
1

TLDR; Мой вопрос: есть ли способ сделать браузеру НЕ переопределять require с его собственной реализацией, и вместо этого он использует другое имя метода (например, browserifyRequire) для всех своих внутренних требований. Для того, чтобы выяснить, почему мне нужно сделать это, пожалуйста, читайте дальше ...Код привязки для CasperJS + SlimerJS с использованием Browserify?

сценарию

Я пытаюсь написать несколько автоматизированных тестов с использованием CasperJS и запуская их в SlimerJS - в отличие от PhantomJS по умолчанию (хотя для всех, кого я знаю, у меня возникли бы следующие проблемы с PhantomJS).

I действительно хочу выяснить, как их записать в CoffeeScript. Как выясняется, CasperJS или SlimerJS сегодня не очень хорошо работают с CoffeeScript. Рекомендация docs заключается в том, чтобы скомпилировать JS перед запуском casper. Хорошо ... не супер удобно, но я могу справиться с этим. На самом деле, я также выясняю, что путь require разрешает пути в этих инструментах не так прост, как в узле, поэтому сборка впереди работы также должна помочь в этом.

Но теперь я столкнулся с новым набором проблем при попытке запустить связанный код. Я использую Browserify для этого.

Проблема

В моем тестовом коде, мне нужно require('casper'). Стандартная практика в мире CasperJS. Поэтому мне пришлось сказать браузеру НЕ, чтобы связать CasperJS, поставив "browser": { "casper": false } в мой package.json. Пока нет проблем. Но проблема следующая:

Browserify переопределяет встроенную функцию require, предоставляя собственную реализацию require, которая делает все, что делает работу браузера. CasperJS в порядке с ним, пока не встретит директиву require('casper'). Это тот самый случай, когда CasperJS должен делать require 'ing, а не браунировать. И это не удается.

неполное Решение

Я совершенно уверен, что CasperJS просто не может справиться с тем, что Browserify переопределяет require, потому что CasperJS реализует свой собственный путь require Инг. Чтобы проверить эту гипотезу, я вручную отредактировал результирующий пакет, переименовав каждое событие require в browserifyRequire - включая реализацию браузера require. Единственный require, который я оставил без изменений, состоял в том, что звонил require('casper'), потому что мне нужен CasperJS, чтобы обрабатывать require ing. И действительно, это делало работу так, как ожидалось.

Вопрос

Опять же, есть способ сделать browserify использовать другое имя для своего внутреннего require? Я полагаю, что я могу написать скрипт, чтобы сделать это изменение после связывания, но я бы скорее понял, как это сделать через config.

Альтернативный Вопрос

Может быть, вместо того, чтобы Browserify есть другое решение для пакетирования и работает CoffeeScript внутри CasperJS? Я еще не нашел ...

ответ

0

Найдено разумное решение - тот, который может быть запущен как npm сценарий, например npm run build-test-bundle путем добавления к package.json

"scripts": { 
    "build-test-bundle": "browserify -t coffeeify casper-coffee-test.coffee | derequire | sed 's/_dereq_..casper../require(\"casper\")/g' > casper-coffee-test.compiled.js" 
}, 

Эта последовательность команд выполняет следующие действия:

  1. browserify -t coffeeify casper-coffee-test.coffee строит сверток
  2. | derequire Трубы выводятся в обозревателе на derequire, npm, что renam х годов все вхождения функции require к _dereq_
  3. | sed 's/_dereq_..casper../require(\"casper\")/g' труб предыдущий выход на команду sed, которая заменяет назад к нормальному требуют все вхождения _dereq_("casper")
Смежные вопросы