Я экспериментирую с ES6, использую gulp для сборки и babel для переноса на ES5. Вывод не запускается в узле, а просто связан с файлом .htm с тегом. Я думаю, мне нужно добавить
<script src='require.js'></script>
или что-то вроде того.
Я пытаюсь импортировать / экспортировать.
////////////////scripts.js
import {Circle} from 'shapes';
c = new Circle(4);
console.log(c.area());
/////////////////shapes.js
export class Circle {
circle(radius) {
this.radius = radius;
}
area() {
return this.radius * this.radius * Math.PI;
}
}
Ошибка
Uncaught ReferenceError: require is not defined
Относится к этому (после .pipe (babel ()) in gulp)
var _shapes = require('shapes');
javascript
ecmascript-6
Джейсон
источник
источник
require
его нет в браузере, вам нужно использовать какой-нибудь инструмент сборки, например Require.js, Browserify или Webpack.require
функцию (опять же, ничего общего с require.js). Однако вы можете указать Babel преобразовать модули во что-то еще , например AMD или UMD, которые затем будут работать с require.js. В любом случае вам нужна система для загрузки модулей в браузер, потому что браузер не предоставляет их по умолчанию (пока).Ответы:
Вам может понадобиться загрузчик модулей, но это не обязательно RequireJS. У вас есть несколько вариантов. Следующее поможет вам начать работу.
rollup.js с помощью rollup-plugin-babel
Rollup - это сборщик модулей JavaScript нового поколения. Он изначально понимает модули ES2015 и создаст пакет, для работы которого не нужен загрузчик модулей. Неиспользуемый экспорт будет удален из вывода, это называется встряхиванием дерева.
Теперь я лично рекомендую использовать rollupjs, так как он дает наиболее четкий вывод и прост в настройке, однако он дает другой аспект ответа. Все остальные подходы делают следующее:
С rollupjs дела обстоят не так. Здесь rollup - это первый шаг, а не babel. По умолчанию он понимает только модули ES6. Вы должны указать модуль ввода, зависимости которого будут отслеживаться и объединяться. Поскольку ES6 позволяет использовать несколько именованных экспортов в модуле, rollupjs достаточно умен, чтобы удалять неиспользуемые экспорты, уменьшая таким образом размер пакета. К сожалению, парсер rollupjs-s не понимает> синтаксис ES6, поэтому модули ES7 должны быть скомпилированы до того, как их проанализирует объединительный пакет, но компиляция не должна влиять на импорт ES6. Это делается с помощью
rollup-plugin-babel
плагина сbabel-preset-es2015-rollup
пресетом (этот пресет такой же, как у es2015, за исключением модуля-преобразователя и плагина external-helpers). Таким образом, при правильной настройке накопительный пакет будет выполнять следующие действия с вашими модулями:Пример сборки nodejs:
Пример сборки grunt с grunt-rollup
Пример сборки gulp с gulp-rollup
Babelify + Browserify
У Babel есть аккуратный пакет под названием babelify . Его использование простое и понятное:
или вы можете использовать его из node.js:
Это сразу перекомпилирует и объединит ваш код. Browserify
.bundle
будет включать в себя небольшой симпатичный загрузчик CommonJS и упорядочит ваши перенесенные модули в функции. У вас может быть даже относительный импорт.Пример:
Для компиляции просто запустите
node build.js
свой проект в корне.Babel + WebPack
Скомпилируйте весь свой код с помощью babel. Я рекомендую вам использовать трансформатор модуля amd (названный
babel-plugin-transform-es2015-modules-amd
в babel 6). После этого свяжите ваши скомпилированные исходники с WebPack.WebPack 2 вышел! Он понимает собственные модули ES6 и будет выполнять (или, скорее, моделировать) встряхивание дерева с помощью babili. встроенную мертвого кода . На данный момент (сентябрь 2016 г.) я все же предлагаю использовать rollup с babel, хотя мое мнение может измениться с выходом первого выпуска WebPack 2. Не стесняйтесь обсуждать свое мнение в комментариях.
Пользовательский конвейер компиляции
Иногда вам нужно больше контроля над процессом компиляции. Вы можете реализовать свой собственный конвейер следующим образом:
Во-первых, вам нужно настроить babel для использования модулей amd. По умолчанию babel переносится в модули CommonJS, что немного сложно обрабатывать в браузере, хотя browserify справляется с ними хорошо.
{ modules: 'amdStrict', ... }
вариантes2015-modules-amd
плагинНе забудьте включить
moduleIds: true
опцию.Проверьте переданный код на наличие сгенерированных имен модулей, часто есть несоответствия между определенными и требуемыми модулями. Смотрите sourceRoot и moduleRoot .
Наконец, у вас должен быть какой-то загрузчик модулей, но это не обязательно requirejs. Есть almondjs , крошечная регулировочная прокладка, которая хорошо работает. Вы даже можете реализовать свои собственные:
В конце вы можете просто объединить прокладку загрузчика и скомпилированные модули вместе и запустить на этом uglify.
Стандартный код Babel дублируется в каждом модуле
По умолчанию большинство вышеперечисленных методов компилируют каждый модуль с babel по отдельности, а затем объединяют их вместе. Это то, что делает babelify. Но если вы посмотрите на скомпилированный код, вы увидите, что babel вставляет множество шаблонов в начало каждого файла, большинство из них дублируются во всех файлах.
Чтобы предотвратить это, вы можете использовать
babel-plugin-transform-runtime
плагин.источник
barebones Webpack 2
1) Если это ваш корневой каталог:
index.html
scripts.js
shape.js
2) иметь узел установлен узел
3) запустите в терминале следующую команду:
5) в корневом каталоге выполните следующее:
Теперь у вас должен быть файл с именем bundle.js в корневом каталоге, который будет использовать ваш index.html. Это минималистичная функция связывания из webpack. Вы можете узнать больше здесь
источник
require
не существует в браузере, поэтому эта ошибка ожидаема. Вам нужно использовать что-то вроде require.js или Browserify.источник