В нашем проекте 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, это не работает должным образом?
Вы действительно используете require.js в браузере? Такое заявление часто используется для изоморфных приложений, которые могут запускаться либо в браузере, либо на сервере node.js. В большинстве случаев 'window.d3' будет правдивым в браузере, поэтому' require («d3») 'никогда не нужно будет выполнять. Если вы используете require.js в браузере, вам, скорее всего, придется опубликовать конфигурацию оптимизации, прежде чем мы сможем помочь. –
Мы используем его в браузере. Я использую Chrome 45.0.2454.85 m. Код слишком велик, чтобы привести пример. Я надеялся, что у кого-то будет такая же проблема или подсказка о том, как искать дальше. Если никто не даст такие советы, я сделаю попытку сделать небольшое приложение, которое воспроизводит проблему. – gogognome