web-dev-qa-db-ja.com

npmモジュールを依存関係なしで単一のファイルにコンパイルします

ncss npmモジュールをExecJSによるコンパイルに適した単一の.jsファイルにコンパイルしようとしています。たとえば、コーヒースクリプトの男は this を持っています。目標は、 Ruby-coffee-script と同様に、単純なRubyラッパーを作成することです。

私がこれまでに試みたこと:

  1. UglifyJSを示唆する答えに出くわしました。それでどこにも行きませんでした。
  2. Browserifyを使用しました。これでうまくいくはずですが、lib/uncss.jsのコンパイルに失敗し、次のエラーメッセージが表示されます。

    Error: ENOENT, open 'tls' while resolving "tls" from file /home/prajjwal/code/uncss/node_modules/request/node_modules/forever-agent/index.js
    

これは、browserifyに適切なシムがないためだと思いますか?また、browserifyがノードモジュールを置き換えるシムについても心配しています。それらは完全に安全に使用できますか?これをRuby gemに埋め込むつもりです。browserifyを使用する必要があるとは思わないでください。npmモジュールからスタンドアロンの.jsを生成する別の方法はありますか? ?

助けていただければ幸いです。

23
Prajjwal

それが仕事に適したツールであるとは思えませんが、browserifyはあなたが探しているものに最も近いもののようです。

完了するために、使用したツールのバージョンは次のとおりです:_Node v0.10.26_および_browserify 3.38.0_。他のバージョンではテストしなかったので、問題がある可能性があります。

uncssのクローンを作成した後に実行した手順は次のとおりです。

  1. _npm install_、適切なパッケージをダウンロードしてセットアップします
  2. NPMのバージョン管理の問題のため 、Githubから_graceful-fs_パッケージ(uncssの依存関係の1つの依存関係)を手動でインストールする必要がありました(そうではありませんでした) npmから入手可能)

    _npm install https://github.com/isaacs/node-graceful-fs/tarball/v2.0.3
    _
  3. この時点で、browserifyを実行しました。 browserifyには_--bare_フラグがあり、次の2つのことを実行します。

    --no-builtins、-no-commondirの両方のエイリアスであり、-insert-global-varsを単に「__filename、__ dirname」に設定します。これは、ノードでバンドルを実行する場合に便利です。

    このフラグを使用すると、browserifyはコアモジュールに独自のシムを挿入しません。私が使用した完全なコマンドは次のとおりです。

    _browserify lib/uncss.js --bare > uncss.js
    _

上記を実行した後、ファイル_uncss.js_には、バンドルされた依存関係とともにuncssが含まれていました。残念ながら、browserifyはすべてを独自のrequire関数内にラップするため、現在バンドルされているモジュールは最初は何もエクスポートしません。

_$ node
> require('./uncss')
{}
>
_

これを修正するには、生成されたバンドルの最初の行を次のように変更する必要がありました。

_(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
_

これに:

_module.exports = (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require,ex;for(var o=0;o<r.length;o++)ex=s(r[o]);return ex})({1:[function(require,module,exports){
_

注:それはではなく_module.exports_の追加だけです-途中でいくつかの変更も必要でした*。

その後、バンドルは機能しているように見えました。

_$ node
> require('./uncss')
[Function: init]
>
_

*:基本的に、browserifyはrequireのように機能する内部function s(o, u)を定義します。周囲のコードは、「メインモジュール」のリストのように見えるもの(この場合は1つだけ)をループし、それらをrequireしますが、結果を保存しないことから始まります。次に、匿名関数全体の出力として、sのような関数(なぜ、私にはわかりません)であるrequireを返します。結果を格納する変数を追加し、代わりにreturnするだけで済みました。

11
voithos

Browserifyには、ここで役立つ--standaloneフラグがあります。

コマンドライン:

browserify -s moduleName --bare moduleName.js -o filename.js

ノードスクリプトでは、連結されたモジュールを通常どおりインポートできます。

var moduleName = require('./filename');

ただし、トリッキーなモジュールを無視したり、スタブアウトしたりする必要がある場合もあります。

13
xer0x

それは不可能ではありませんが、少し複雑です。自動的に実行することを知っているツールはありませんが、手動で実行する必要があります。

したがって、この方法でモジュールをロードすると、次のようになります。

var async = require('async');

そのモジュールのソースを含めることができます。最初に、メインスクリプトでモジュールインスタンスを宣言します。

var global_async = null;

次に、無名関数内にモジュールコードを含め、「module.exports」を前に宣言したグローバル変数に置き換えます。

module.exports = async

global_async = async;

問題は、「uncss」には多くの依存関係があり、それぞれにいくつかの依存関係があるため、多くの作業を行う必要がありますが、不可能ではありません...しかし、最後に、このモジュールには「」のようないくつかの外部バイナリも必要です。 phantomjs」。

「uncss」のラッパーを作成するgemを作成する場合は、ノードとuncssがインストールされているかどうかを確認できます。インストールされていない場合は、両方をインストールしてから、uncssがphantomjsで行うように呼び出します。

0
Rodrigo Polo