Ответы пользователя по тегу Vue.js
  • Как правильно тестировать роуты во VueJS?

    @FullStackAlex
    Веб-разработчик, электрик, кочевник
    Потерял вчера целый день пытаясь решить эту казалось бы простую проблему.
    Но как в итоге выяснил Vue-Test-Utils не предусматривает изменения во vue-router:

    Dealing with Routing
    Since routing by definition has to do with the overall structure of the application and involves multiple components, it is best tested via integration or end-to-end tests. For individual components that rely on vue-router features, you can mock them using the techniques mentioned above.


    Поэтому для подобной задачи нужно использовать E2E testing tools как Puppeteer, TestCafe и Cyprus. Или же (что я сейчас пока лишь пробую, но может сегодня более подробно описать смогу) не использовать vue-test-utils wrapper а использовать реальную Vue rendered app.

    Update:
    Ок, решил проблему.
    Vue-Test-Utils нельзя использовать из-за createLocalVue() и mount(), так как обе функции не дают возможность использовать для создания Vue инстанции "Full UMD bundler" .

    Vue-Test-Utils сделан для максимальной изоляции компоненты. Хотя добавить FULL UMD поддержку казалось бы не такая уж и большая задача, но увы.

    Поэтому нужно как уже и писал обходится без vue-test-utils. А так как я ненавижу Facebook - я принципиально не использую Jest, Yarn, React итп (по крайней мере в личных проектах), а использую Mocha + Chai + Sinon + jsdom, но принцип один и тот же, да и синтаксис практически такой же:

    import chai from "chai";
    const expect = chai.expect;
    const should = chai.should();
    
    import App from '~/testing-router-without-wrapper/App.vue';
    
    import VueRouter from 'vue-router';
    import router from '~/testing-router-without-wrapper/router.js';
    
    //https://github.com/vuejs/vue-router/issues/713
    import Vue from "vue/dist/vue.js";
    Vue.use(VueRouter);
    
    //jsdom создаст HTML документ но так как я в своём app ссылаюсь везде на #app в функции app container, нужно создать соответсвующий элемент:
    let element = document.createElement("div");
    element.id = "app";
    const myApp = new Vue({
        el: element,
        router,
        render: h => h(App),
        components: {App},
    });
    
    describe('Testing App.vue with Route 1', () => {
    
        it('Title of Home component is true', () => {
            console.log( "myApp.$el.innerHTML", myApp.$el.innerHTML );
            expect(myApp.$el.innerHTML.includes('<h1 id="title">Home Title</h1>')).to.be.true;
        });
    
        it('Pushing Route1 and checking title of Route1 component is true', done => {
            myApp.$router.push('/route1');
            setTimeout(()=>{
                console.log( "myApp.$el.innerHTML", myApp.$el.innerHTML );
                expect(myApp.$el.innerHTML.includes('<h1 id="title">Route 1 Title</h1>')).to.be.true;
                done();
            },1000);
    
        });
    });
    Ответ написан
    Комментировать
  • Как исправить ошибку SyntaxError: Unexpected token { в модульных тестах?

    @FullStackAlex
    Веб-разработчик, электрик, кочевник
    У меня это ошибка возникла в связи с TweenLite от GSAP. Проблема в том, что тесты производятся в Node.js environment и Node.js не поддерживает ES6 Modules и export. Поэтому весь используемый код должен быть по стандарту ES5.

    Решение проблемы:
    - писать/использовать код по ES5
    - или же если вы используете Babel, тогда нужно в Webpack конфигурации указать какие папки нужно должен обрабатывать:

    webpack.test.js
    const merge = require('webpack-merge');
    const dev = require('./webpack.dev.js');
    const path = require('path');
    
    module.exports =
        merge(dev, {
    
            module: {
                rules: [
                    {
                        test: /\.js$/,
                        loader: 'babel-loader',
                        exclude: /node_modules/,
                        //или же вместо exclude наоборот указать какие папки использовать:
                        include: [
                             path.resolve(__dirname, 'src'),
                             path.resolve(__dirname, 'test'),
                             path.resolve(__dirname, 'node_modules/gsap')
                        ],
                        options: {
                            presets: ['@babel/preset-env'],
                            plugins: [
                                '@babel/plugin-transform-runtime',
                                '@babel/plugin-proposal-object-rest-spread',
                                '@babel/plugin-syntax-dynamic-import',
                                'transform-es2015-arrow-functions'
                            ]
                        }
                    },
                ]
            },
        });
    Ответ написан
    Комментировать
  • Почему не работает переход по ссылке в edge (vue.js)?

    @FullStackAlex
    Веб-разработчик, электрик, кочевник
    Если проблема связана с JavaScript a не с CSS (если например какой то элемент накрывает часть кнопки), то возможно нужно просто расширить "радиус" Babel.
    https://webpack.js.org/loaders/babel-loader/
    https://cli.vuejs.org/config/#babel

    Мой "native" (то есть без vue-cli) webpack.common.js :

    module.exports = {
        entry: {},
        resolve: {
            alias: { },
            extensions: []
        },
        plugins: [ ],
        module: {
            rules: [
                {
                    test: /\.js$/,
                    loader: 'babel-loader',
                    exclude: /node_modules/,
                    options: {
                        presets: ['@babel/preset-env'],
                        plugins: [
                            '@babel/plugin-proposal-object-rest-spread',
                            '@babel/plugin-syntax-dynamic-import',
                            'transform-es2015-arrow-functions'
                        ]
                    }
                },
            ]
        }
    };
    Ответ написан
    Комментировать
  • Можно ли средствами php инициализировать создание страницы в nuxt.js?

    @FullStackAlex
    Веб-разработчик, электрик, кочевник
    Не разбираюсь в modx и не до конца понял вопрос но сделал совсем недавно решение (как кажется) похожей проблемы с WordPress без nuxt.js:
    https://wue-theme.app
    https://github.com/Tech-Nomad/wue-theme

    Nuxt.js годен только для Headless CMS. CMS в таком случае действует лишь как REST API. Но то что вы хотите, так как я понимаю это не headless. Поэтому вам прийдётся избавится от Nuxt.js и внедрить Dynamic Rendering в комбинации с предоставлением данных через PHP при первой загрузке приложения. Тогда нужно будет "просто" синхронизировать routes modx вместе с routes от vue-router и никакого создания Vue файлов на сервере не нужно.
    Ответ написан
    Комментировать
  • Как инициализировать приложение, когда загружены данные по API?

    @FullStackAlex
    Веб-разработчик, электрик, кочевник
    Не совсем понимаю как работает первая часть main.js и зачем v-if="false", но по ходу нужно просто инициализировать внутри callback then:

    ApiService.init()
    
    if (JwtService.getToken()) {
      ApiService.setHeader()
      ApiService.mount401Interceptor()
      store
        .dispatch('auth/checkAuth')
        .then(() => {
          store.dispatch('project/getProjectById', router.app.$route.params.projectId)
    
          new Vue({
              router,
              store,
              render: h => h(App)
          }).$mount('#app')
    
        })
    }
    Ответ написан
    Комментировать
  • Возможно ли во Vue компоненте подключить какой-либо компонент из родительского?

    @FullStackAlex
    Веб-разработчик, электрик, кочевник
    Вместо имени компоненты просто передавайте саму компоненту. Соответственно компонента должна быть импортирована в родительской Аpp. В своих приложениях я передаю компоненты через Vuex но с props думаю тоже должно также сработать.

    Только вместо components нужно будет в data декларировать динамичную компоненту. Вот простой пример:
    https://codesandbox.io/s/vue-template-ifw07
    Ответ написан
    1 комментарий
  • Что почитать по архитектуре Vue-приложения?

    @FullStackAlex
    Веб-разработчик, электрик, кочевник
    Я лично не назвал бы себя особо большым спецом. Но написал уже пару приложений от и до с Vue.js и так получилось что создал насколько я знаю первую полноценную plug and play тему для WordPress (то есть без Node.js SSR но при этом с полной SEO поддержкой, таким образом пользователь может её просто установить как обычную тему на своём сайте и использовать без каких либо дополнительных работ над кодом сайта, что на данный момент при остальных существующих концептах для WordPress в сфере Vue.js не возможно).

    При самообучении (главным образом 22-ух часовый курс от Maximilian Schwarzmüller на Udemy.com) я не натыкался на серьёзные ресурсы с углублённым обсуждением архитектуры Vue.js приложений. Наверное те кто в этом шпарит не сидят особо на тостере или stackoverflow :) По этому я лично просто подстраивал архитектуру своих приложений под endpoints данного Backend (Symfony 4 и WordPress). Для WordPress я просто организую компоненты как я бы организовал обыкновенную тему для WordPress:
    post.php ---> src/components/main/single/post.vue
    index.php ---> src/components/main/lists/posts.vue
    front-page.php ---> src/components/main/pages/home.vue
    page.php ---> src/components/main/single/page.vue
    archive-{custom-post-type}.php ----> src/components/main/lists/{custom-post-type}-posts.vue

    Сайт я делю на части Main, Header, Footer, (Sidebar, если навигация не в Header,) и Modals. (Глобальная) Коммуникация между ними происходит через Vuex модули. А Vue-Router обрабатывает HTTP запросы, используя при этом Axios.

    Обширные и многочисленные методы и hooks (activated, mounted, etc) одной компоненты пытаюсь насколько можно переносить в Mixins и делать их универсальными для использования в других компонентах чтобы держать script tag максимально чистым (когда ищешь ошибки, 200-400 строчек скрипта и 10 разных между собой связанных методов могут стать огромным pain in the ass).

    Совсем недавно натолкнулся на этого парня, которого пару статей и сайт мне понравились:
    https://markus.oberlehner.net/
    Возможно уже в его обширных статьях вы найдёте кучу нужной информации. В добавок он собирается как раз на эту тему выпускать книгу и тут можно на его newsletter подписаться (я подписался и пока никакого спама, только по теме):
    https://oberlehner.us20.list-manage.com/subscribe?...

    А вот куча интересных ссылок которые получаешь при первых же результатах поиска "Vue.js аrchitecture" (то есть без гарантий с моей стороны):
    https://v1.vuejs.org/guide/application.html
    https://learn-vuejs.github.io/vue-patterns/useful-...
    https://itnext.io/how-to-structure-a-vue-js-projec...
    https://dev.to/maxpou/3-tips-for-scaling-large-vue...

    В этой книге есть часть под названием "Large Application Patterns with Vuex":
    https://www.amazon.de/dp/B01N6VAO4P

    Эта книга тоже кажется интересная, более 200 страниц посвящены Vuex и Vue-Router:
    https://www.amazon.de/Fullstack-Vue-Complete-Guide...

    Ну и последним самые авторитетные ресурсы на эту и похожие темы с VueConf Talks:
    https://www.vuemastery.com/conferences/vuejs-amste...
    https://www.vuemastery.com/conferences/vueconf-tor...
    https://www.vuemastery.com/conferences/vueconf-tor...
    https://www.vuemastery.com/conferences/vueconf-tor...
    https://www.vuemastery.com/conferences/connect-tec...
    https://www.vuemastery.com/conferences/vueconf-us-...
    https://www.vuemastery.com/conferences/vueconf-us-...
    https://www.vuemastery.com/conferences/vueconf-us-...
    https://www.vuemastery.com/conferences/vueconf-us-...
    https://www.vuemastery.com/conferences/vueconf-us-...
    https://www.vuemastery.com/conferences/vueconf-us-...
    https://www.vuemastery.com/conferences/vueconf-us-...
    https://www.vuemastery.com/conferences/vueconf-us-...

    Have fun :)
    Ответ написан
    3 комментария
  • Vue.js + Wordpress?

    @FullStackAlex Автор вопроса
    Веб-разработчик, электрик, кочевник
    Наконец таки я решил все технические вопросы для внедрения Vue.js в WordPress-Workflow. Долго я к этому шёл. Трудно было совместить freelancing на основе WordPress и WooCommerce и одновременно самообучение Symfony и Vue.js и создание первых реальных проектов на их основе. Но создание первого большого проекта на основе headless Symfony 4 (JSON API) и потребителя на основе Vue.js меня хорошо продвинуло вперед в направлении внедрения Vue.js в WordPress. Почему мне так интересен WordPress/WooCommerce умея делать Backend на основе Symfony? Потому что WordPress делает доступным веб технологии и маленьким клиентам по "демократическим" ценам, при этом всё ещё позволяя фрилансеру хорошо заработать (по крайней мере в Берлине, где я проживаю).

    Так как путь сюда до сих пор никем в интернете детально не описан и я угрохал недели если не месяцы на решение этой задачи прочитывая все статьи и docs с этой темой связанные (освоил для этого даже наконец таки Docker и Nginx и углубил знания в настройке Webpack) и пройдя многие не верные пути (vue-cli, nuxt.js) - я решил создать в течении следующих недель курс на Udemy.com на английском за 20 баксов. Если будет тут достаточно интереса (хотя бы лайков 10 ), то сделаю туториал и на русском. Курс будет содержать настройки Webpack, Docker (optional), Apache/Nginx. Моё решение сохраняет в отличии от nuxt.js все преимущества как WordPress так и Vue.js при этом соблюдая "законы" SEO и Social Marketing (Twitter Cards, Facebook Open Graph итп) и самое главное Hot Module Replacement с PHP/WordPress Templates!!!!!! .
    Я очень разочарован Nuxt.js и расскажу в Tutorial почему он далеко не во всех случаях технически годен и почему с точки зрения open source этот проект не оптимальный исходя из моего личного опыта.

    UPDATE 15.05.2019
    К сожалению руки до туториала так и не дошли. Но создал Github Repo с простым Starter Theme.
    Демо можно тут просмотреть: wue-theme.app
    Пока без доскональной документации. Надеюсь к концу месяца создам.
    Приколы темы:
    -Hot Module Replacement с PHP файлами (если только это интересно можно и тут скачать Webpack config)
    -полная поддержка SEO без Server Side Rendering (SSR). Реализуется это за счёт загрузки данных вместе с HTML в глобальном JS объекте "technomad", вместо дополнительного AJAX-запроса, что не поддерживается гуглом и для чего и нужны все прибамбасы типа Nuxt.js и phpv8/v8js.
    -элементы меню и новости автоматически добавляются через WordPress-Backend.
    -тема устонавливается как и любая другая тема без каких либо дополнительных настроек сервера (нужно скачать всю Repository и скомпремировать "wuetheme" папку в ZIP и тогда можно просто загружать как и обычную тему).
    -Github Repo без данных из демонстрации. Может ещё добавлю функцию установки демо данных.
    -сервер демо во Франкфурте без CDN. Так что во Владивостоке загрузка наверное немного дольше длится будет)) Из Берлина за 600-700ms загружается с VPS.
    -есть ещё много над чем работать (pagination, проверка загруженны ли скрипты и стили плагинов при Ajax route change, пока они загружаются только при инициальной загрузки, но скрипты и стили могут быть на каждой странице иные) , нo даже в данном виде эта тема на сколько я знаю уникальная.
    -тут можно проследить прогресс перестройки моего сайта с этой темой: stage.alexfullstack.dev, там больше клёвых анимаций))
    Пока всё. Have fun :)

    Update 30.05.2019
    Много чего обновил на Github.

    Update 02.06.2019
    Я решил вчерашнюю проблему)))
    Нужно было просто выспаться))
    Завтра подробно опишу и обновлю Github Repo.

    Update 03.06.2019
    -загрузил на Github новую "bulletproof SEO" версию с "Dynamic Rendering Implementation"
    -подробная статья тут

    Update 14.06.2019
    Перенёс сайт на wue-theme.app.
    Демонстрация Github версии тут: starter.wue-theme.app
    Добавил простую Load More Pagination и очистил код.
    Ответ написан
    21 комментарий