Three.js

Three.js

Сборочные инструменты

      Проверка с помощью — менеджер пакетов, входящий в состав Node.js');" onmouseout="hide()">npm

В данной статье рассказывается как получить three.js в среде node.js, так чтобы можно было выполнять автоматические проверки. Тестирование можно запускать из командной строки или с помощью автоматизированных инструментов непрерывной интеграции
непрерывная интеграция — это практика разработки
программного обеспечения, которая заключается в
слиянии рабочих копий в общую основную ветвь
разработки несколько раз в день и выполнении частых
автоматизированных сборок проекта для скорейшего
выявления и решения интеграционных проблем.');" onmouseout="hide()">(CI)
, вроде Travis.
Более подробно про непрерывную интеграцию можно посмотреть в Википедии или на Хабрахабре.

Сокращенный вариант

Если вам привычна работа с node и npm,
$ npm install three --save-dev
и к своей проверке добавьте
var THREE = require('three');

Создание проекта для тестирования с нуля

Если эти инструменты вам незнакомы, вот краткое руководство (для Linux процесс установки будет немного отличаться от работы в Windows, но команды npm идентичны).

Basic setup

  1. Устанавливаем npm и node.js. Кратчайший путь обычно выглядит приблизительно так
    $ sudo apt-get install -y npm nodejs-legacy
    # fix any problems with SSL in the default registry URL
    $ npm config set registry http://registry.npmjs.org/
  2. Делаем каталог нового проекта
    $ mkdir test-example; cd test-example
  3. Запрашиваем npm для создания файла нового проекта to create a new project file for you:
    $ npm init
    and accept all defaults by hitting Enter on all the prompts. This will create package.json.
  4. Try and start the test feature with
    $ npm test
    This will fail, which is expected. If you look in the package.json, the definition of the test script is
    "test": "echo \"Error: no test specified\" && exit 1"

Добавляем
многофункциональная среда для тестирования JavaScript,
работающая на Node.js и в браузере, что делает
асинхронное тестирование простым и интересным.
' +'Тестирование Mocha запускается поочередно, позволяя
гибко и точно сообщать, а также сопоставлять
неперехваченные исключения с правильными
тестовыми примерами.');" onmouseout="hide()">mocha

Будем использовать mocha.
  1. Устанавливаем mocha с помощью
    $ npm install mocha --save-dev
    Обратите внимание, что node_modules/ создан и все зависимости окажуться там. Также отметьте, что package.json был обновлен: добавлено и обновлено свойство devDependencies при помощи --save-dev. Notice that node_modules/ is created and your dependencies appear in there. Also notice that your package.json has been updated: the property devDependencies is added and updated by the use of --save-dev.
  2. Edit package.json to use mocha for testing. When test is invoked, we just want to run mocha and specify a verbose reporter. By default this will run anything in test/ (not having directory test/ can run into npm ERR!, create it by mkdir test)
    "test": "mocha --reporter list"
  3. Перезапускаем тест с помощью
    $ npm test.
    Теперь он должен быть успешным, This should now succeed, reporting 0 passing (1ms) or similar.

Добавление three.js

  1. Let's pull in our three.js dependency with
    $ npm install three --save-dev
    • Если нужна другая версия three.js, используйте
      $ npm show three versions
      чтобы посмотреть, какая доступна. to see what's available. To tell npm the right one, use
      $ npm install [email protected] --save
      (0.84.0 in this example). --save makes this a dependency of this project, rather than dev dependency. Для более подробных сведений смотрите документацию здесь.
  2. Mocha will look for tests in test/, so let's
    $ mkdir test.
  3. Finally we actually need a JS test to run. Let's add a simple test that will verify that the three.js object is available and working. Create test/verify-three.js containing:
    var THREE = require('three');
    var assert = require("assert");
    describe('The THREE object', function() { it('should have a defined BasicShadowMap constant', function() { assert.notEqual('undefined', THREE.BasicShadowMap); }),
    it('should be able to construct a Vector3 with default of x=0', function() { var vec3 = new THREE.Vector3(); assert.equal(0, vec3.x); }) })
  4. Finally let's test again with $ npm test. This should run the tests above and succeed, showing something like:
    The THREE object should have a defined BasicShadowMap constant: 0ms
    The THREE object should be able to construct a Vector3 with default of x=0: 0ms
    2 passing (8ms)

Добавляем свой собственный код

Нужно сделать три вещи:
  1. Написать тест для ожидаемого поведения своего кода и разместить его в test/. Вот пример из реального проекта.
  2. Экспортируйте свой действующий код таким образом, чтобы nodejs мог его видеть, для использования в сочетании с require. Смотрите пример здесь. Export your functional code in such a way that nodejs can see it, for use in conjunction with require. See it [link:https://github.com/air/encounter/blob/master/js/Physics.js here].
  3. Require your code into the test file, in the same way we did a require('three') in the example above.
Пункты 2 и 3 будут зависеть от того, как вы управляете своим кодом. В примере Physics.js, приведенном ниже, Items 2 and 3 will vary depending on how you manage your code. In the example of Physics.js given above, the export part is right at the end. We assign an object to module.exports:
//=============================================================================
// make available in nodejs
//=============================================================================
if (typeof exports !== 'undefined')
{
  module.exports = Physics;
}

Работа с зависимостями

Если вы уже пользовались чем-то умным, вроде
Он оптимизирован для работы в браузере, но может
использоваться и в других средах JavaScript, вроде
Rhino и Node. Использование модульного загрузчика
скрипта, подобного RequireJS, повышает скорость
и качество кода.');" onmouseout="hide()" target="_blank">require.js
или browserify, пропустите эту часть.

Обычно, проект three.js запускается в браузере. Следовательно, загрузка модуля браузером выполняет множество скриптовых тегов. Отдельные файлы проекта не должны беспокоиться о зависимостях. Module loading is hence done by the browser executing a bunch of script tags. Your individual files don't have to worry about dependencies. Однако, в контексте nodejs нет файла index.html, увязывающего все вместе, так что In a nodejs context however, there is no index.html binding everything together, so you have to be explicit.

Если экспортируется модуль, зависящий от других файлов, нужно указать node о их загрузке.
Вот один из подходов:
  1. В начале кода модуля проверьте, находитесь ли вы в среде node.js.
  2. Если это так, явно объявите зависимости.
  3. Если нет, то вероятно вы в браузере, так что больше ничего не нужно делать.
Пример кода из Physics.js:
//=============================================================================
// setup for server-side testing (установка проверки на стороне сервера)
//=============================================================================
if (typeof require === 'function') // test for nodejs environment (проверка среды nodejs)
{
  var THREE = require('three');
  var MY3 = require('./MY3.js');
}