Nano Hash - криптовалюты, майнинг, программирование

Browserify — несколько точек входа

Я использую Browserify внутри gulp. Я также пытаюсь скомпилировать свои тесты в один файл. Но в отличие от моего основного приложения, которое у меня отлично работает, у меня возникают проблемы с компиляцией тестов. Основное отличие состоит в том, что у тестов есть несколько точек входа, а не одна точка входа, как в этом приложении. Но я получаю ошибки от Browserify, что он не может найти точку входа.

browserify   = require 'browserify'
gulp         = require 'gulp'
source       = require 'vinyl-source-stream'

gulp.task 'tests', ->
    browserify
        entries: ['./app/js/**/*Spec.coffee']
        extensions: ['.coffee']
    .bundle 
        debug: true
    .pipe source('specs.js') 
    .pipe gulp.dest('./specs/')

Ответы:


1

Ниже приведена задача, которую мне удалось построить, которая, кажется, решает проблему. В основном я использую внешнюю библиотеку для сбора имен файлов в виде массива. А затем передайте этот массив в качестве точек входа

'use strict;'

var config = require('../config');
var gulp = require('gulp');
var plumber = require('gulp-plumber');
var glob = require('glob');
var browserify  = require('browserify');
var source = require('vinyl-source-stream');

gulp.task('tests', function(){
  var testFiles = glob.sync('./spec/**/*.js');
  return browserify({
      entries: testFiles,
      extensions: ['.jsx']
    })
    .bundle({debug: true})
    .pipe(source('app.js'))
    .pipe(plumber())
    .pipe(gulp.dest(config.dest.development));
});
27.06.2014
  • var testFiles = glob.sync('./spec/**/*.js'); помог мне вместо использования glob(paths.js+'/**.js', function(err, widgetFiles) {.... +1 ???? 16.12.2015
  • а если у вас есть массив шаблонов, используйте globs вместо glob: npmjs.com/package/globs 12.05.2020

  • 2

    Вот альтернативный рецепт, который больше соответствует парадигме gulp с использованием gulp.src().

    var gulp = require('gulp');
    var browserify = require('browserify');
    var transform = require('vinyl-transform');
    var concat = require('gulp-concat');
    
    gulp.task('browserify', function () {
    
      // use `vinyl-transform` to wrap around the regular ReadableStream returned by b.bundle();
      // so that we can use it down a vinyl pipeline as a vinyl file object.
      // `vinyl-transform` takes care of creating both streaming and buffered vinyl file objects.
      var browserified = transform(function(filename) {
        var b = browserify(filename, {
          debug: true,
          extensions: ['.coffee']
        });
        // you can now further configure/manipulate your bundle
        // you can perform transforms, for e.g.: 'coffeeify'
        // b.transform('coffeeify');
        // or even use browserify plugins, for e.g. 'minifyiy'
        // b.plugins('minifyify');
        // consult browserify documentation at: https://github.com/substack/node-browserify#methods for more available APIs
        return b.bundle();
      });
    
      return gulp.src(['./app/js/**/*Spec.coffee'])
        .pipe(browserified)/
        .pipe(concat('spec.js'))
        .pipe(gulp.dest('./specs'));
    });
    
    gulp.task('default', ['browserify']);
    

    Для получения более подробной информации о том, как это работает, эта статья, которую я написал, содержит более подробную информацию: http://medium.com/@sogko/gulp-browserify-the-gulp-y-way-bb359b3f9623

    15.08.2014
  • Небольшое замечание: недостатком этого метода является то, что вы не можете поменять местами в watchify. По моему опыту, по мере того, как ваши сборки становятся длиннее, встроенные часы gulp не очень подходят для большой скомпилированной браузерной формы. 25.08.2014
  • Я согласен, вам понадобится другой подход для проектов с более крупной сборкой: - один из подходов заключается в использовании watchify для выполнения небольших инкрементных сборок (но, как вы упомянули, browserify+watchify требует изменения рецепта; я мог бы подумать о написании одного для этого ) — еще один подход, который я лично предпочитаю, — это разделить кодовую базу на пакеты. большинство проектов, как правило, имеют код приложения и код поставщика (реагируют, угловые и т. д.). Я изложил подход здесь (Внимание: запись еще сырая) 27.08.2014
  • Также обратите внимание, что этот подход может быть несовместим с некоторыми плагинами браузера, такими как minifyify. В этом случае вы в значительной степени вынуждены принять подход Мэтта. 04.09.2014
  • @superEb: ну, это не совсем так. этот подход использует исходную библиотеку браузера напрямую, поэтому вы все еще можете выполнять преобразования и использовать плагины браузера, как изначально предполагалось. Обновлен ответ с дополнительной информацией о том, как использовать плагины, такие как minifyify 05.09.2014
  • Да, очевидно, вы можете вызвать b.plugin("minifyify", opts) внутри преобразования, но когда я попробовал это, это привело к ошибке потока, например TypeError: Object #<Readable> has no method 'write'. Преобразование работает без плагина, поэтому я предполагаю, что существует несовместимость между minifyify и Vinyl-Transform. 05.09.2014
  • Я не думаю, что это решение уже работает должным образом: github.com/substack/node- обозревать/проблемы/1217 15.05.2015
  • У меня возникли ошибки при использовании этого решения: _stream_readable.js:540 var ret = dest.write(chunk); TypeError: undefined is not a function 12.01.2016

  • 3

    Для начала вы можете написать suite.js, чтобы потребовать все тесты, которые вы хотите запустить, и просмотреть их.

    Вы можете увидеть два примера из моего проекта https://github.com/mallim/sbangular.

    Один пример для grunt-mocha-phantomjs

    https://github.com/mallim/sbangular/blob/master/src/main/resources/js/suite.js

    Один пример для транспортира

    https://github.com/mallim/sbangular/blob/master/src/main/resources/js/suite.js

    Это только начало, и я уверен, что есть более причудливые способы.

    13.06.2014
  • Я знаю, что могу использовать набор, но я пытался этого избежать. Чтобы не было проблем с необходимостью не забывать добавлять новые файлы. 19.06.2014

  • 4

    Немного более сложный пример сборки файлов по шаблону глобуса во множество файлов с просмотром и перестроением отдельных файлов. Не для .coffee, для es2015, но не большая разница:

    var gulp = require("gulp");
    var babelify = require("babelify");
    var sourcemaps = require("gulp-sourcemaps");
    var gutil = require("gulp-util");
    var handleErrors = require("../utils/handleErrors.js");
    var browserify = require("browserify");
    var eventStream = require("event-stream");
    var glob = require("glob");
    var source = require("vinyl-source-stream");
    var buffer = require("vinyl-buffer");
    var watchify = require("watchify");
    
    var SRC_PATH = "./src";
    var BUILD_PATH = "./build";
    
    var bundle = function (bundler, entryFilepath) {
      console.log(`Build: ${entryFilepath}`);
    
      return bundler.bundle()
        .on("error", handleErrors)
        .pipe(source(entryFilepath.replace(SRC_PATH, BUILD_PATH)))
        .pipe(buffer())
        .on("error", handleErrors)
        .pipe(
          process.env.TYPE === "development" ?
            sourcemaps.init({loadMaps: true}) :
            gutil.noop()
        )
        .on("error", handleErrors)
        .pipe(
          process.env.TYPE === "development" ?
            sourcemaps.write() :
            gutil.noop()
        )
        .on("error", handleErrors)
        .pipe(gulp.dest("."))
        .on("error", handleErrors);
    };
    
    var buildScripts = function (done, watch) {
      glob(`${SRC_PATH}/**/[A-Z]*.js`, function (err, files) {
        if (err) {
          done(err);
        }
    
        var tasks = files.map(function (entryFilepath) {
          var bundler = browserify({
            entries: [entryFilepath],
            debug: process.env.TYPE === "development",
            plugin: watch ? [watchify] : undefined
          })
            .transform(
              babelify,
              {
                presets: ["es2015"]
              });
    
          var build = bundle.bind(this, bundler, entryFilepath);
    
          if (watch) {
            bundler.on("update", build);
          }
    
          return build();
        });
    
        return eventStream
          .merge(tasks)
          .on("end", done);
      });
    };
    
    gulp.task("scripts-build", function (done) {
      buildScripts(done);
    });
    
    gulp.task("scripts-watch", function (done) {
      buildScripts(done, true);
    });
    

    Полный код здесь https://github.com/BigBadAlien/browserify-multy-build

    06.06.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..