2016-04-20 2 views
1

TLDR; Meine Frage ist: Gibt es eine Möglichkeit, browserify nicht require mit einer eigenen Implementierung zu überschreiben, und stattdessen verwenden Sie einen anderen Methodennamen (z. B. browserifyRequire) für alle eigenen internen erfordern. Um herauszufinden, warum ich dies tun müssen, lesen Sie bitte weiter ...Paketcode für CasperJS + SlimerJS mit Browserify?

Das Szenario

Ich versuche, einige automatisierte Tests mit CasperJS zu schreiben und sie in SlimerJS läuft - in Bezug auf die Standard PhantomJS gegen (obwohl ich nach allem, was ich weiß, auf die gleichen Probleme mit PhantomJS stoßen würde).

ich wirklich möchte herausfinden, wie man diese in CoffeeScript schreibt. Wie sich herausstellt, sind CasperJS oder SlimerJS mit CoffeeScript heutzutage nicht gut. Die Empfehlung der Dokumentation besteht darin, zu JS vor laufendem Casper zu kompilieren. Ok ... nicht super praktisch, aber ich kann damit umgehen. In der Tat, ich finde auch heraus, dass die Art und Weise require Pfade in diesen Tools zu lösen ist nicht so einfach wie in Node, so Bündelung vor dem Ausführen sollte auch dabei helfen.

Aber jetzt stoße ich auf eine neue Reihe von Problemen, wenn ich versuche, den gebündelten Code auszuführen. Ich verwende Browserify dafür.

Das Problem

In meinem Test-Code, muss ich require('casper'). Standard Praxis in der CasperJS Welt. Also musste ich browserify sagen, dass ich CasperJS nicht bündeln soll, indem ich "browser": { "casper": false } in meine package.json setze. Bis jetzt keine Probs. Aber das Problem kommt als nächstes:

Browserify überschreibt die eingebaute require-Funktion und liefert seine eigene Implementierung von require, die all die Dinge macht, die browserify funktionieren lassen. CasperJS ist damit einverstanden, bis es die Richtlinie require('casper') trifft. Das ist das einzige Mal, dass CasperJS das require inging, nicht browserifizieren muss. Und das scheitert.

Die unvollständige Lösung

Ich bin mir ziemlich sicher, dass CasperJS einfach nicht mit der Tatsache, dass Browserify require Vorrang umgehen kann, weil CasperJS seine eigene Art und Weise require ing implementiert. Um diese Hypothese zu testen, habe ich das resultierende Bündel manuell bearbeitet und jedes Auftreten von require in browserifyRequire umbenannt - einschließlich der Implementierung von browserify von require. Der einzige require, den ich unverändert gelassen habe, war der Anruf an require('casper'), denn das ist das eine Mal, dass ich CasperJS brauche, um die require ing zu behandeln. Und tatsächlich hat dies die Dinge wie erwartet funktionieren lassen.

Die Frage

Wieder ist es eine Möglichkeit, browserify Verwendung einen anderen Namen für seine eigene interne require zu machen? Ich denke, ich kann ein Skript schreiben, um diese Änderung nach der Bündelung zu machen, aber ich würde viel lieber herausfinden, wie man das über Config macht.

Eine Alternative Frage

Vielleicht statt Browserify es eine andere Lösung ist für die Bündelung und Coffeescript innerhalb CasperJS läuft? Ich habe noch keinen gefunden ....

Antwort

0

eine vernünftige Lösung gefunden - eine, die als npm Skript ausgeführt werden kann, zB npm run build-test-bundle von

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

Diese Abfolge von Befehlen an package.json Hinzufügen führt Folgendes aus:

  1. browserify -t coffeeify casper-coffee-test.coffee baut das Bündel
  2. | derequire Rohre der browserify Ausgang derequire, ein npm die Renam es alle Vorkommen von require Funktion _dereq_
  3. | sed 's/_dereq_..casper../require(\"casper\")/g' Rohre vorherige Ausgabe an den sed Befehl, die wieder normal ersetzt erfordern alle Vorkommen von _dereq_("casper")
Verwandte Themen