2015-09-11 5 views
0

В нашем проекте Grails мы используем c3.js (который зависит от d3.js) для отображения диаграмм. При развертывании на тестовом сервере графики работают нормально. Если я запустил приложение на своем ноутбуке, я вообще не вижу диаграмм.require ("d3") иногда возвращает 3 вместо объекта

Консоль Chrome показывает следующее сообщение

Uncaught TypeError: Cannot read property 'category10' of undefined 

После небольшой отладки я обнаружил следующие строки в c3.js:

function ChartInternal(api) { 
    var $$ = this; 
    $$.d3 = window.d3 ? window.d3 : typeof require !== 'undefined' ? require("d3") : undefined; 
    $$.api = api; 

я поставил точку останова здесь и проверили значения из window.d3, который был не определен, и значение require("d3"), которое было номером 3 вместо объекта!

У меня мало опыта работы с Javascript и require.js, но я уверен, что функция require должна возвращать объект вместо int.

Хром показывает, что загружены как c3.js, так и d3.js.

Почему один и тот же код, установленный на тестовом сервере, отлично работает и развернут на localhost? Кто-нибудь знает, как дальше расследовать причину этой проблемы?

Update 1

Я обнаружил, что если я начну это приложение с компьютера Windows, эта проблема возникает. Если я запускаю это приложение с компьютера Linux, эта проблема не возникает. Не важно, на каком компьютере используется браузер. Протестировано с помощью Chrome 45.0.2454.85 m и Firefox 40.0.3.

Update 2

Я просто понял, что d3.js содержит много греческих букв. Файл хранится в формате UTF-8 (согласно IntelliJ). Если я открою файл в Chrome на моем компьютере под управлением Windows, греческие символы превратятся в мусор. Странно то, что заголовки ответа на запрос о d3.js показать, что используется UTF-8:

Cache-Control:no-cache, no-store, must-revalidate 
Content-Type:application/javascript;charset=utf-8 
Date:Tue, 15 Sep 2015 12:59:39 GMT 
Expires:Thu, 01 Jan 1970 00:00:00 GMT 
Pragma:no-cache 
Server:Apache-Coyote/1.1 
Transfer-Encoding:chunked 

Может ли сказать мне, почему на компьютере Windows, это не работает должным образом?

+0

Вы действительно используете require.js в браузере? Такое заявление часто используется для изоморфных приложений, которые могут запускаться либо в браузере, либо на сервере node.js. В большинстве случаев 'window.d3' будет правдивым в браузере, поэтому' require («d3») 'никогда не нужно будет выполнять. Если вы используете require.js в браузере, вам, скорее всего, придется опубликовать конфигурацию оптимизации, прежде чем мы сможем помочь. –

+0

Мы используем его в браузере. Я использую Chrome 45.0.2454.85 m. Код слишком велик, чтобы привести пример. Я надеялся, что у кого-то будет такая же проблема или подсказка о том, как искать дальше. Если никто не даст такие советы, я сделаю попытку сделать небольшое приложение, которое воспроизводит проблему. – gogognome

ответ

1

Наконец-то я нашел причину проблемы. This issue at Github указывает, что файлы в каталоге ресурсов проекта Grails не кодируются в кодировке UTF-8. Я добавил параметр VM -Dfile.encoding=UTF-8 в конфигурацию запуска в IntelliJ, и это устранило проблему.

Смежные вопросы