Подтвердить что ты не робот

Vueify + Gulp: улучшение обработки CSS

Синтаксис синтаксиса одиночных файлов Vue создает уникальную загадку для участников задач, так как два отдельных конвейера (JS и CSS) находятся в одном файле.

Теперь я знаю, что с помощью инструмента командной строки Browserify выполняется следующее:

browserify -t vueify -p [ vueify/plugins/extract-css -o dist/app.css ] -e src/index.js | uglifyjs -o dist/app.js

Это создает два выходных файла: app.css и app.js, а при загрузке в браузере он отображает мой компонент со стилем, как ожидалось

Теперь я хочу улучшить этот вывод. Как вы можете видеть в этом примере, я беру JS, который сгенерировал и передал его в uglifyjs - его минимизацию при подготовке к производству. Однако таких преобразований, применяемых к CSS, нет. Он не минимизирован, ненужный CSS не удаляется, автоматическое префикса не выполняется и т.д.

Поскольку скрипты NPM позволяют вам запускать только одну команду, мне казалось, что то, что я хочу, может быть невозможно в одной команде командной строки. Мне нужна команда one для извлечения CSS и другого, чтобы изменить ее - стиль Grunt/ Gulp.

Это привело меня к использованию Gulp в моем проекте.

Используя плагин Vueify extract-css, я могу сбросить этот CSS в файл следующим образом:

browserify('./main.js')
  .transform('vueify')
  .plugin('vueify/plugins/extract-css', {
    out: 'dist/bundle.css'
  })
  .bundle()

Это вытягивается непосредственно из документация Vueify, хотя они упоминают, что out "также может быть записываемым потоком" без каких-либо примеров для что они подразумевают под этим или как это сделать.

Вот где я столкнулся с моей первой проблемой. Этот крошечный бит кода примера не работал у меня:

const gulp = require("gulp");
const browserify = require("browserify");
const source = require("vinyl-source-stream");
const buffer = require("vinyl-buffer");

gulp.task("default", function() {
    browserify("src/index.js")
        .transform("vueify")
        .plugin("vueify/plugins/extract-css", {
            out: "dist/app.css"
        })
        .bundle()
        .pipe(source("app.js"))
        .pipe(buffer())
        .pipe(gulp.dest("dist"));
});

Этот чрезвычайно простой пример (который, как я мог сказать, сделал то же самое, что и мой NPM script), не работал, заставив браузер сбросить следующую ошибку:

[Vue warn]: Failed to mount component: template or render function not defined.

found in

---> <Anonymous>
       <Root>

Хуже того, передав параметр {debug: true}, чтобы увидеть, что может произойти неправильно, вы получите несущественную карту источника:

введите описание изображения здесь

Это не похоже на мой исходный код:

введите описание изображения здесь

Что я делаю неправильно и почему очень простой пример с ошибкой extract-css?

Update

На прошлой неделе я быстро пытался перебирать различные эксперименты с помощью разных бустеров JavaScript и создавать инструменты, и мои различные вопросы StackOverflow остались без ответа, несмотря на то, что предлагали награды, поэтому после 4-5 дней ответа и отсутствия решения Я отказывался от проектов и двигался дальше.

Это означает, что для того, чтобы вытащить исходный код и показать, что я делал в прошлый раз, я должен повторно клонировать репо или повторно запускать команды Yeoman и возвращаться к исходному сломанному состоянию.

В этом случае этой конкретной проблемы, следуя точным шагам из моего документа "как воспроизвести" блокнота, он не смог воспроизвести. Я много экспериментировал и выяснил, что происходит .

Прежде всего, все мои исходные файлы:

Источник

index.html

<html>
<head>
    <link rel="stylesheet" href="/app.css" />
</head>
<body>
    <div id="app"></div>
    <script src="/app.js"></script>
</body>
</html>

index.js:

const Vue = require("vue");
const VueRouter = require("vue-router");
const App = require("./App.vue");

Vue.use(VueRouter);
const router = new VueRouter(require("./router"));

const app = new Vue({
    el: "#app",
    render: function(create) { create(App); }
});

маршрутизатор/index.js:

export default {routes: []};

App.vue:

<template>
    <div id="app">
        <p>Test</p>
    </div>
</template>

<script>
export default {
};
</script>

<style lang="sass" scoped">
#app {
    background-color: #f00;
}
</style>

Исследование

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

Failed to mount component: template or render function not defined.

Эта ошибка чаще всего возникает при использовании Vue Runtime вместо Vue Compiler

Тем не менее, это было не мое дело. Поскольку я не использую шаблон, я использую функцию визуализации - и она присутствовала (и работала при использовании браузера из командной строки). Вместо этого странный источник отображает намек на то, где моя проблема могла жить. Прочитав изображение, я разместил его более тщательно, пытаясь загрузить vue-hot-reload-api. Это инструмент, с которым я начал экспериментировать, но сдался, так как это вызывало у меня проблемы.

Я считаю, что когда я удалил этот модуль, мне не удалось удалить все ссылки на него, и поэтому Browserify пытался связать его со всем остальным. Не имея возможности найти модуль в node_modules, Browserify по умолчанию полагает, что он является внешним модулем и оставляет код в уродливом формате, который вы видите выше. Тот факт, что это произошло только при запуске Gulp, а не при запуске через командную строку, может быть объяснено содержимым каталога node_modules/.bin - если он не синхронизировался после запуска npm uninstall.

Я считаю, что если бы я удалил свою папку node_modules и запустил npm install, проблема сама бы разрешилась.

4b9b3361

Ответ 1

1.

хотя они упоминают, что "также может быть записываемым потоком", без каких-либо примеров того, что они подразумевают под этим или как это сделать это

Это похоже на инструмент, который позволяет разделить поток vue файлов gulp на два потока: один (основной поток) для содержимого JS, который передается вниз, и второй (боковой поток) для CSS. Это позволило бы даже применить некоторые преобразования gulp к CSS.

var through = require('through2')
// we'll need some intermediate stream to capture `out`
// the best candidate here is a transform-kind stream
// I'm using `through2` but node `Transform` can be used as well

var source = require('vinyl-source-stream')
// tool for transforming plain stream to vinyl as you do with browserify

var css = through()
// we can instantiate `through2` without transform function
// which means that transform = identity (no transformation)

// now do:
.plugin("vueify/plugins/extract-css", {
    out: css, /* pipe to `css` node stream */
})

css = css.pipe(source('app.css'))
css = css.pipe(any_gulp_plugin())
// work with it as usual
css = css.pipe(gulp.dest(some_dst))

// to make gulp.task even better we can merge main stream and side
// stream after both gulp.dest are applied to
// guarantee proper task completion
var merge = require('merge-stream')

return merge(js, css)

2. Что касается вашего основного вопроса, я считаю, что вы уже все разобрались, но я хочу отметить, что такие проблемы выглядят как проблемы с плагинами и не имеют особого значения. Возможно, некоторые плагины слишком сырые и не поддерживают некоторые угловые случаи. Я лично использую Vue, но не использую vue файлы и предпочитаю разделять их на стиль, script и файлы шаблонов, сгруппированные в один каталог. Глубокий контент, который vue файл, почти всегда приводит к таким проблемам, с которыми вы столкнулись. Поэтому я предпочитаю, чтобы мой JS был чист от CSS. Мои шаблоны - это Pug, и они вставляются в компонент vue простым import template from 'template.pug' с небольшой помощью от мошеннического плагина (rollup-plugin-pug в моем случае). Гетерогенное содержимое содержит множество вопросов, как применять преобразования к суб-содержанию и требует специальной поддержки для использования существующих инструментов преобразования.