1

clojurescript プロジェクトで Sha256 を要求しようとすると、次のようになります。

(ns tutorial-client.sha256
  (:require
   [goog.crypt.Sha256 :as hasher]))

実際のコンパイル エラーは発生しませんが、ブラウザーで clojurescript->js の出力を開くと、次のエラーが発生します。

Uncaught Error: Undefined nameToPath for goog.crypt.Sha256 base.js:586
Uncaught ReferenceError: cljs is not defined rendering.js:7
goog.require could not find: goog.crypt.Sha256 base.js:333
Uncaught Error: goog.require could not find: goog.crypt.Sha256 base.js:337
Uncaught ReferenceError: cljs is not defined behavior.js:8
Uncaught ReferenceError: cljs is not defined app.js:100
Uncaught TypeError: Cannot read property 'IE' of undefined eventtype.js:60
Uncaught TypeError: Cannot read property 'entryPointRegistry' of undefined events.js:1084
Uncaught TypeError: Cannot read property 'IE' of undefined browserfeature.js:35
Uncaught TypeError: Cannot read property 'Error' of undefined asserts.js:71
Uncaught TypeError: Cannot read property 'prototype' of undefined base.js:1407
Uncaught Error: Invalid event type events.js:139
Uncaught Error: Invalid event type events.js:139
Uncaught TypeError: Cannot call method 'call' of undefined 

おそらくほとんど無視できると思いますが、問題は基本的に goog.crypt.Sha256 が見つからないというトップエラーです。面白いことに、コードを次のように変更すると、すべてのエラーを解消できます。

(ns tutorial-client.sha256
  (:require
   [goog.net.XhrIo :as hasher]))

とにかく、 goog.crypt.sha256 にアクセスしたいだけです。ありがとうございました。

4

2 に答える 2

2

生の JavaScript 関数にアクセスするときは、JVM の場合と同様に、Clojure の相互運用機能を利用する必要があることに注意してください。これは、名前空間宣言が次のように変更されることを意味します。

(ns tutorial-client.sha256
  (:import goog.crypt.Sha256]))

(.log js/console (Sha256.))
;; this will log the instance to the browser console

ここからは、インスタンスの JavaScript 関数を呼び出すことで、通常どおり使用できるようになります。

(def sha-256 (Sha256.))
(.update sha-256 [])

(.log js/console (.digest sha-256))
于 2013-09-17T11:00:38.247 に答える