クライアント側のJavaScriptrequire()


83

require()クライアント側で(または同様のものを)使用することは可能ですか?

var myClass = require('./js/myclass.js');

回答:


41

これについては、require.jsまたはhead.jsを調べる必要があります。


5
@Debra:彼らのウェブサイトの「使用法」セクションに行ってみませんか?
軌道上でのライトネスレース2011年

2
見てみましょう)(必要とするあなたはrequire.js、head.jsまたはLab.js.よりも軽量なソリューションをしたい場合は、
Torben 2013

2
...または最近では、クライアント側のコードをwebpack
Aprillion

requirejsを使用するときは、注意事項に注意してください:stackoverflow.com/questions/29652716/…。そうでなければ、私のために働きます。
user180574 2018年


14

Node.jsスタイルがrequire必要な場合は、次のようなものを使用できます。

var require = (function () {
    var cache = {};
    function loadScript(url) {
        var xhr = new XMLHttpRequest(),
            fnBody;
        xhr.open('get', url, false);
        xhr.send();
        if (xhr.status === 200 && xhr.getResponseHeader('Content-Type') === 'application/x-javascript') {
            fnBody = 'var exports = {};\n' + xhr.responseText + '\nreturn exports;';
            cache[url] = (new Function(fnBody)).call({});
        }
    }
    function resolve(module) {
        //TODO resolve urls
        return module;
    }
    function require(module) {
        var url = resolve(module);
        if (!Object.prototype.hasOwnProperty.call(cache, url)) {
            loadScript(url);
        }
        return cache[url];
    }
    require.cache = cache;
    require.resolve = resolve;
    return require;
}());

注意:このコードは機能しますが、不完全であり(特に、URL解決)、すべてのNode.js機能を実装しているわけではありません(昨夜これをまとめました)。 このコードは実際のアプリでは使用しないでくださいが、出発点になります。私はこの単純なモジュールでそれをテストしました、そしてそれは働きます:

function hello() {
    console.log('Hello world!');
}

exports.hello = hello;

3
それは解決策ではないので、私はこの答えが好きでした。人々がただ解決策を与えるとき、私はそれを本当に嫌います。次回解決策を見つけるのに役立つ答えを与えてください。よくやった!
ジャスミン

13

私は自分自身にまったく同じ質問をしました。それを調べたとき、私は選択肢が圧倒的であることに気づきました。

幸い、要件に基づいて最適なローダーを選択するのに役立つこの優れたスプレッドシートを見つけました。

https://spreadsheets.google.com/lv?key=tDdcrv9wNQRCNCRCflWxhYQ


1
スプレッドシートに値するオプションの存在は、開発者としての私たちがこれを行うための優れた方法をまだ見つけていないことを意味するのだろうか?
コスタ


7

一般に、コンパイル時にスクリプトを前処理し、それらを1つ(またはごく少数)のパッケージにバンドルして、コンパイル時requireにも「軽量シム」に書き換えることをお勧めします。

私はそれを行うことができるはずの「新しい」ツールをグーグルで検索しました

そして、すでに述べたものbrowserifyも非常にうまく適合するはずです--http://esa-matti.suuronen.org/blog/2013/04/15/asynchronous-module-loading-with-browserify/

モジュールシステムとは何ですか?


また、バンドルのほかに、そのバンドル内からノードパッケージを使用することもできますか?
eran otzap 2016

4

アイテムをロードするDOMに要素を作成できます。

そのようなように:

var myScript = document.createElement('script'); // Create new script element
myScript.type = 'text/javascript'; // Set appropriate type
myScript.src = './js/myclass.js'; // Load javascript file

4

Browserifyを使用するだけです。これは、本番環境に入る前にファイルを処理し、ファイルをバンドルにパックするコンパイラのようなものです。

プロジェクトのファイルを必要とするmain.jsファイルがあると考えてください。その中でbrowserifyを実行すると、すべてが処理され、すべてのファイルとのバンドルが作成されます。これにより、requireHTTPリクエストなしでブラウザーで呼び出しを同期的に使用できます。たとえば、パフォーマンスやバンドルのサイズのオーバーヘッドはほとんどありません。

詳細については、リンクを参照してください:http//browserify.org/


Browserifyは2011年に@dkastnerによってすでに言及されました。私は私の答えでいくつかの代替案をグーグルで検索しましたが、私はまだ
一番の

2

すでにいくつかの答えがありますが、YUI3とそのオンデマンドモジュールのロードについて説明したいと思います。サーバー(node.js)とクライアントの両方で機能します-クライアントまたはサーバーのいずれかで実行されているまったく同じJSコードを使用してページを構築するデモWebサイトがありますが、それは別のトピックです。

YUI3:http://developer.yahoo.com/yui/3/

ビデオ:http//developer.yahoo.com/yui/theater/

例:

(前提条件:7k yui.jsの基本的なYUI3関数がロードされている)

YUI({
    //configuration for the loader
}).use('node','io','own-app-module1', function (Y) {
    //sandboxed application code
    //...

    //If you already have a "Y" instance you can use that instead
    //of creating a new (sandbox) Y:
    //  Y.use('moduleX','moduleY', function (Y) {
    //  });
    //difference to YUI().use(): uses the existing "Y"-sandbox
}

このコードは、YUI3モジュール「node」と「io」、およびモジュール「own-app-module1」をロードしてから、コールバック関数を実行します。すべてのYUI3およびown-app-module1関数を含む新しいサンドボックス「Y」が作成されます。グローバル名前空間には何も表示されません。モジュール(.jsファイル)のロードは、YUI3ローダーによって処理されます。また、(オプション、ここには表示されていません)構成を使用して、ロードするモジュールの-debugまたは-min(ified)バージョンを選択します。


1

非常に異なるアプローチをとるソリューションは次のとおりです。すべてのモジュールをJSONオブジェクトにパッケージ化し、追加のリクエストなしでファイルの内容を読み取って実行することでモジュールを要求します。

https://github.com/STRd6/require/blob/master/main.coffee.md

STRd6 / requireは、実行時にJSONパッケージを使用できるかどうかに依存します。require関数は、そのパッケージのために生成されます。パッケージには、アプリが必要とする可能性のあるすべてのファイルが含まれています。パッケージにはすべての依存関係がバンドルされているため、これ以上httpリクエストは行われません。これは、クライアントで必要なNode.jsスタイルにできるだけ近いものです。

パッケージの構造は次のとおりです。

entryPoint: "main"
distribution:
  main: 
    content: "alert(\"It worked!\")"
  ...
dependencies:
  <name>: <a package>

ノードとは異なり、パッケージは外部名を認識しません。名前を付けるのは、依存関係を含むパッケージ次第です。これにより、完全なカプセル化が提供されます。

そのすべての設定を前提として、パッケージ内からファイルをロードする関数を次に示します。

loadModule = (pkg, path) ->
  unless (file = pkg.distribution[path])
    throw "Could not find file at #{path} in #{pkg.name}" 

  program = file.content
  dirname = path.split(fileSeparator)[0...-1].join(fileSeparator)

  module =
    path: dirname
    exports: {}

  context =
    require: generateRequireFn(pkg, module)        
    global: global
    module: module
    exports: module.exports
    PACKAGE: pkg
    __filename: path
    __dirname: dirname

  args = Object.keys(context)
  values = args.map (name) -> context[name]

  Function(args..., program).apply(module, values)

  return module

この外部コンテキストは、モジュールがアクセスできるいくつかの変数を提供します。

A require彼らは他のモジュールが必要な場合がありますので、機能をモジュールにさらされています。

グローバルオブジェクトへの参照や一部のメタデータなどの追加のプロパティも公開されます。

最後に、モジュール内でプログラムを実行し、コンテキストを指定します。

この回答は、ブラウザで同期node.jsスタイルのrequireステートメントを使用したい場合や、リモートスクリプトロードソリューションに関心がない場合に最も役立ちます。


1

コンポーネントプロジェクトが他のソリューション(require.jsを含む)よりもはるかに合理化されたワークフローを提供していることがわかったので、https://github.com/component/componentをチェックすることをお勧めします。私はこれが少し遅い答えであることを知っていますが、誰かに役立つかもしれません。


0

これは、Webクライアントでrequireとexportsを使用する軽量の方法です。これは「名前空間」グローバル変数を作成する単純なラッパーであり、CommonJS互換コードを次のような「define」関数でラップします。

namespace.lookup('org.mydomain.mymodule').define(function (exports, require) {
    var extern = require('org.other.module');
    exports.foo = function foo() { ... };
});

ここに他のドキュメント:

https://github.com/mckoss/namespace


0

クライアント側-必要ライブラリを非同期提供するload()任意のJSファイルまたはNPMモジュール(用途をロードするために使用することができる機能module.exports)、任意の.cssファイル、任意の.jsonいずれかを、.html、テキストのような任意の他のファイルを。

例えば、 npm install clientside-require --save

<script src = '/node_modules/clientside-require/dist/bundle.js'></script>
<script>
load('color-name') // an npm module
   .then(color_name=>{
        console.log(color_name.blue); // outputs  [0, 0, 255]
   })
</script>

このプロジェクトの本当にすばらしい部分は、edスクリプトで、node.jsで期待するのと同じ方法でload()同期require()関数を使用できることです。

例えば、

load('/path/to/functionality.js')

と内部/path/to/functionality.js

var query_string = require("qs") // an npm module
module.exports = function(name){
    return qs.stringify({
         name:name,
         time:new Date()
    }
}

最後の部分である同期require()メソッドの実装により、サーバー上で実行するように構築されたNPMパッケージを利用できるようになります。


このモジュールはrequire、ブラウザに可能な限り密接に機能を実装するように設計されています。免責事項:私はこのモジュールを作成しました。


どこかに完全な実例はありますか?クライアント側で自分のクラスを読み込もうとしていますが、機能しません。
jallmer

-4

はい、それは非常に使いやすいですが、スクリプトタグによってブラウザにjavascriptファイルをロードする必要があります

<script src="module.js"></script> 

次に、次のようなjsファイルのユーザー

var moduel = require('./module');

電子を使ってアプリを作っていますが、期待通りに動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.