Gulp Uglify Создание странных персонажей из библиотеки Paper.js

Я использую пакет Bower Paper.js в проекте. Я использую Gulp для подготовки проекта для браузера. Однако есть некоторые символы, которые выглядят так в bower_components/paper/dist/paper-full.min.js:

\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec...

которые заканчиваются так после прохождения Gulp:

ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԧԱ-Ֆՙա-ևא-תװ-ײؠ-يٮ...

В результате консольная ошибка

Uncaught SyntaxError: Неверное регулярное выражение: ΊΌΎ-Ρ[Еще много странных символов] Диапазон не по порядку в классе символов

Вот соответствующий фрагмент моего файла gulp:

var gulp = require('gulp');
var stylus = require('gulp-stylus');
var uglify = require('gulp-uglify');
var concat = require('gulp-concat');
var browserify = require('browserify');
var reactify = require('reactify');
var source = require('vinyl-source-stream');
var jade = require('gulp-jade');
var nib = require('nib');
var del = require('del');

var cfg = require('./cfg.json');

var action = {
  clean: function(cb){
    del([
      ['./', cfg.dir.root.dev].join('')
    ], cb);
  },
  concatLibs: function(){
    gulp.src([
      './bower_components/jquery/dist/jquery.min.js',
      './bower_components/react/react.js',
      './bower_components/when/es6-shim/Promise.js',
      './bower_components/lodash/lodash.min.js',
      './bower_components/postal.js/lib/postal.min.js',
      './bower_components/oboe/dist/oboe-browser.min.js',
      './bower_components/paper/dist/paper-full.min.js'])
      .pipe(uglify())
      .pipe(concat('lib.js'))
      .pipe(gulp.dest(['./', cfg.dir.root.dev, cfg.dir.type.js].join('')));
  },
...

Я изолировал проблему в этой части процесса:

.pipe(uglify()) // in the concatLibs action

То есть закомментирование этой строки не генерирует необычные символы и не приводит к ошибке консоли.

Метод uglify() кажется каноническим, требуемым следующим образом: var uglify = require('gulp-uglify'). Так в чем проблема? Почему uglify() вызывает это?


person Scotty H    schedule 07.10.2015    source источник
comment
Я предлагаю вам использовать неминифицированную версию paper.js и посмотреть, что произойдет, хотя это выглядит определенно странно.   -  person Olatunde Garuba    schedule 13.10.2015
comment
@generalgmt Да, я попробовал неминифицированную версию с теми же результатами. Удалось ли вам воспроизвести проблему?   -  person Scotty H    schedule 13.10.2015
comment
Я не смог воспроизвести ошибку. Я внедрил его в свой скрипт. может стоит проверить версию. используется бумажная версия 0.9.24 и версия uglify 1.4.1.   -  person Olatunde Garuba    schedule 15.10.2015
comment
Эта часть paper.js уже минифицирована, поэтому использование неминифицированной версии ничем не отличается. Код взят из acorn и реализует шаблоны RegExp идентификаторов, отличных от ASCII. Когда я использую либо исходный код acorn, либо вывод gulp-uglify и вручную создаю строки RegExp, все работает правильно, даже если символы отображаются так, как вы говорите. Net, это правильная интерпретация символов, которые вводятся как \uXXXX. Я использовал paper-0.9.25 и uglify версии 1.2.0 и 1.4.2.   -  person bmacnaughton    schedule 11.11.2015


Ответы (2)


Проблема здесь, похоже, в том, что вы искажаете уже минимизированные библиотеки.

Лучшим подходом было бы не трогать сторонние библиотеки, а только объединять их как есть. Это будет означать, что вы должны включать минимизированные источники ваших библиотек, когда это возможно. Теперь у вас есть неминифицированные версии react.js и Promise.js.

И react, и es6-shim предоставляют уменьшенную версию, которая уже используется при выполнении bower install. Чтобы исправить это, ваша задача должна выглядеть так:

...
concatLibs: function(){
    gulp.src([
      './bower_components/jquery/dist/jquery.min.js',
      './bower_components/react/react.min.js',
      './bower_components/when/es6-shim/Promise.min.js',
      './bower_components/lodash/lodash.min.js',
      './bower_components/postal.js/lib/postal.min.js',
      './bower_components/oboe/dist/oboe-browser.min.js',
      './bower_components/paper/dist/paper-full.min.
      .pipe(concat('lib.js'))
      .pipe(gulp.dest(['./', cfg.dir.root.dev, cfg.dir.type.js].join('')));
  }
...

Это предоставит вам lib.js только с минимизированными сторонними библиотеками с минимальными изменениями в вашем gulpfile.js.

person Elger van Boxtel    schedule 14.01.2016

В то время как при использовании символов Unicode параметр ascii_only должен быть установлен как true.

В этом случае .pipe(uglify({output: {ascii_only:true}})) должно работать.

ascii_only (по умолчанию false) -- экранирует символы Unicode в строках и регулярных выражениях (влияет на директивы с не-ascii-символами, которые становятся недействительными). Параметры удаления

person sumana    schedule 06.12.2018