Задать вопрос
Ответы пользователя по тегу Webpack
  • Почему бабел ругается на такой синтаксис класса?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Попробуйте добавить в babel.config.js

    module.exports = {
      plugins:  [
        '@babel/plugin-proposal-class-properties'
      ]
    }


    Ну и установить, конечно, этот пакет
    Ответ написан
    9 комментариев
  • Как правильно собрать 2 разных js в webpack?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    package.json
    {
        "private": true,
        "scripts": {
            "site:development": "mix",
            "site:watch": "mix watch",
            "site:hot": "mix watch --hot",
            "site:production": "mix --production",
            "dashboard:watch": "cross-env TARGET=dashboard mix watch",
            "dashboard:hot": "cross-env TARGET=dashboard mix watch --hot",
            "dashboard:production": "cross-env TARGET=dashboard mix --production"
        },
        "devDependencies": {
            "browser-sync": "^2.26.14",
            "browser-sync-webpack-plugin": "^2.2.2",
            "chalk": "^4.1.0",
            "cross-env": "^7.0.3",
            "dotenv": "^8.2.0",
            "laravel-mix": "^6.0.13",
            "resolve-url-loader": "^3.1.2",
            "sass": "^1.32.8",
            "sass-loader": "^10.1.1"
        },
        "dependencies": {}
    }

    webpack.mix.js
    /** @type {Api} */
    const mix = require('laravel-mix');
    const path = require('path');
    const dotenv = require('dotenv');
    /** @type {Chalk} */
    const chalk = require('chalk');
    
    const dotEnvLocation = path.resolve('./.env');
    dotenv.config({ path: dotEnvLocation });
    
    const WATCH = process.argv.includes('--watch');
    const HOT = process.argv.includes('--hot');
    const localDomain = process.env.LOCAL_DOMAIN ?? 'localhost';
    const target = process.env.TARGET ?? 'site';
    
    let browserSyncPort = 3000;
    let hmrPort = 8088;
    
    const logs = {
        mode    : WATCH ? chalk.red('WATCH') : HOT ? chalk.red('HOT') : 'None',
        domain  : process.env.LOCAL_DOMAIN ?? chalk.red(localDomain),
        frontend: process.env.FRONTEND_DIST ?? chalk.red(process.env.FRONTEND_DIST),
        backend : process.env.BACKEND_DIST ?? chalk.red(process.env.BACKEND_DIST),
    };
    
    console.log(chalk.cyan('Local domain:  ') + logs.domain);
    console.log(chalk.cyan('Location .env: ') + dotEnvLocation);
    console.log(chalk.cyan('Mode:          ') + logs.mode);
    console.log(chalk.cyan('Public paths:'));
    console.log(chalk.cyan('  Frontend:    ') + logs.frontend);
    console.log(chalk.cyan('  Backend:     ') + logs.backend);
    
    if (target === 'dashboard') {
        browserSyncPort = process.env.BACKEND_LOCAL_PORT ?? 3000;
        hmrPort = process.env.BACKEND_HMR_PORT ?? 8088;
        require('./webpack-dashboard.mix.js');
    }
    
    if (target === 'site') {
        browserSyncPort = process.env.FRONTEND_LOCAL_PORT ?? 3001;
        hmrPort = process.env.FRONTEND_HMR_PORT ?? 8089;
        require('./webpack-site.mix.js');
    }
    
    /*==
     *== Customize options
     *== ======================================= ==*/
    
    mix.version();
    
    mix.disableSuccessNotifications();
    
    if (!HOT && WATCH) {
        mix.browserSync({
            proxy    : localDomain,
            startPath: target === 'site' ? '/' : '/admin',
            browser  : ['chrome'],
            notify   : false,
            port     : browserSyncPort,
        });
    }
    
    mix.options({
        clearConsole: false,
        hmrOptions  : {
            host: 'localhost',
            port: hmrPort,
        },
    });
    
    const webpackResolveRules = {
        extensions: ['*', '.wasm', '.mjs', '.js', '.jsx', '.json', '.vue'],
        alias     : {
            '@': path.join(__dirname, 'resources/js'),
        },
    };
    
    mix.sourceMaps(false, 'source-map');
    
    if (!mix.inProduction()) {
        mix.webpackConfig({
            output : { devtoolModuleFilenameTemplate: '[resource-path]' },
            resolve: webpackResolveRules,
        });
    } else {
        mix.webpackConfig({
            resolve: webpackResolveRules,
        });
    }

    webpack.mix.site.js
    /** @type {Api} */
    const mix = require('laravel-mix');
    
    const HOT = process.argv.includes('--hot');
    
    if (!process.env.FRONTEND_DIST) throw Error;
    
    mix.setPublicPath(`public/${process.env.FRONTEND_DIST}`);
    if (!HOT) mix.setResourceRoot(`/${process.env.FRONTEND_DIST}`);
    
    mix.js('resources/js/app.js', 'js');
    
    mix.sass('resources/scss/app.scss', 'css');
    
    mix.extract();

    webpack.mix.dashboard.js
    /** @type {Api} */
    const mix = require('laravel-mix');
    
    const HOT = process.argv.includes('--hot');
    
    if (!process.env.BACKEND_DIST) throw Error;
    
    mix.setPublicPath(`public/${process.env.BACKEND_DIST}`);
    if (!HOT) mix.setResourceRoot(`/${process.env.BACKEND_DIST}`);
    
    mix.js('resources/dashboard/js/main.js', 'js');
    
    mix.sass('resources/dashboard/scss/main.scss', 'css');
    
    mix.extract();

    .env
    LOCAL_DOMAIN=delphinpro.local
    FRONTEND_LOCAL_PORT=3000
    FRONTEND_HMR_PORT=8003
    FRONTEND_DIST=dist/frontend
    BACKEND_LOCAL_PORT=3004
    BACKEND_HMR_PORT=8004
    BACKEND_DIST=dist/backend

    config/app.php
    <?php
    return [
        // .....
        'frontend' => [
            'dist' => env('FRONTEND_DIST'),
        ],
        'backend' => [
            'dist' => env('BACKEND_DIST'),
        ],
    ];

    *.blage.php
    <link href="{{ mix('css/app.css', config('app.frontend.dist')) }}" rel="stylesheet">
    <script src="{{ mix('js/app.js', config('app.frontend.dist')) }}"></script>
    Ответ написан
    Комментировать
  • Как работать с зависимостями в Webpack?

    delphinpro
    @delphinpro Куратор тега Sass
    frontend developer
    Разбиваете на несколько точек входа
    Настраиваете SplitChunkPlugin
    Ответ написан
    1 комментарий
  • Как сделать чтобы по умолчанию на localhost была определенная страница?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Начать читать документацию, например.
    https://webpack.js.org/configuration/dev-server/#d...
    Ответ написан
    Комментировать
  • Правильные ли конфиги вебпак и gulp для Vue проекта?

    delphinpro
    @delphinpro
    frontend developer
    Да, забивать шурупы молотком — это хороший выбор =)

    Но в целом, вроде правильно. Если через webpackStream

    Я так делал. правда не для Vue, а просто, чтобы писать на привычном es6.
    Но я использовал node интерфейс вебпака.
    Покажу свой таск, разбирайтесь:

    webpack.task.js

    const path = require('path');
    
    const bs      = require('browser-sync');
    const webpack = require('webpack');
    
    const config      = require('../../gulp.config');
    const tools       = require('../lib/tools');
    const DEVELOPMENT = require('../lib/checkMode').isDevelopment();
    
    let webpackConfig = require(path.join(config.root.main, 'webpack.config.js'));
    
    function showInfo(err, stats) {
      // эту функцию приводить не буду. просто вывод ошибок в консоль
    }
    
    module.exports = function (options = {}) {
    
        options = {
            watch: false,
            ...options,
        };
    
        return function (done) {
    
            const compiler = webpack(webpackConfig);
    
            if (options.watch) {
                tools.info('Webpack watching...');
    
                compiler.watch({
                    ignored         : /node_modules/,
                    aggregateTimeout: 300,
                }, (err, stats) => {
    
                    showInfo(err, stats);
    
                    if (DEVELOPMENT && bs.has(config.browserSync.instanceName)) {
                        bs.get(config.browserSync.instanceName).reload();
                    }
                });
    
            } else {
    
                compiler.run((err, stats) => {
                    showInfo(err, stats);
                    done();
                });
    
            }
    
        };
    };
    Ответ написан
  • Как указать папку для изображений из sass в Laravel mix?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Зачем же по сути два проекта пихать в один конфиг? Напишите разные, и запускайте по отдельности.
    Я сейчас не помню, можно ли в package.json указывать разные .mix.js файлы. Но точно можно внутри этого файла писать условные конструкции. Это же просто js файл. Вот и ориентируйтесь на переменные окружения, которые задавайте в строке запуска команд..
    Ответ написан
    3 комментария
  • Почему не могу правильно подключить плагин copy webpack?

    delphinpro
    @delphinpro
    frontend developer
    Как это в официальной документации не нашлось решений?
    Вы внимательнее посмотрите — https://webpack.js.org/plugins/copy-webpack-plugin/

    да и в ошибке ясно написано: message: "should have required property 'patterns'",
    schema: {
    definitions: { ObjectPattern: [Object], StringPattern: [Object] },
    type: 'object',
    additionalProperties: false,
    properties: { patterns: [Object], options: [Object] },
    required: [ 'patterns' ]
    },
    Ответ написан
  • Настройка webpack?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Начиная с версии 4 webpack придерживается принципа zero config. Вы просто создаете папку src, в ней файл main.js и запускаете вебпак. С этого и начинайте. Потом добавляйте нужные именно вам лоадеры и плагины. Просто смотрит е документацию и делайте как написано. У вебпака очень хорошая дока.
    Ответ написан
    Комментировать
  • Как разобраться в работе js сборщиков, транспайлеров etc?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Причин краша самих сборщиков не так много.
    Чаще всего, это несовместимость версий используемых пакетов. Например, третий галп ни в какую не хочет запускаться под четырнадцатой нодой. Выход - обновиться до четвертого галпа или откатить ноду на компе до 8 (или 12, не помню уже).
    Node-sass иногда вываливается с ошибкой несовместимости бинарника. Просто пересобираем бинарник.
    Вчера отвалился vue-cli (давно не использовал). Я даже выяснять не стал, почему, просто выполнил npm i -g @vue/cli и все заработало. Опять же что-то там с версиями было.
    Ну и т.д.

    А информация о настройке пакетов всегда доступна на их официальных сайтах или в репозиториях на гитхабе. Тут достаточно просто уметь читать.
    Ответ написан
    3 комментария
  • Как правильно подключать vue js на сайт?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    мне кажется этот метод не очень красивый

    Нормальный метод.

    но на сайте не подойдет этот вариант так как придется в шаблон выводить теги вида

    Тоже норм. Как вариант, можно использовать атрибут is (правда он тоже не пройдет валидацию w3c)

    <div is="logikaOne">
    </div>
    Ответ написан
    Комментировать
  • Как настроить webpack для сборки нескольких страниц?

    delphinpro
    @delphinpro
    frontend developer
    Попробуйте sliptChunk вкупе с magic comments https://webpack.js.org/api/module-methods/#magic-c...

    Это не отдельные файлы, но динамический импорт отдельных файлов на нужных страницах.

    А для отдельных как раз и предназначены точки входа.
    Ответ написан
  • Как использовать async\await во Vue?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    А then то зачем?

    example: async() => {
      console.log('start');
      for (let i in this.orders) {
          await this.getOrder();
          console.log('loaded ' + i);
      }
      console.log('finish');
    }




    UPD

    Важно: в определении методов нельзя использовать стрелочную функцию, если вам нужен доступ к this. Освежите знания по стрелкам, контекстам.
    Ответ написан
    Комментировать
  • Как импортировать Swiper при помощи Webpack?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Всё правильно. Css нужно импортировать отдельно. В js.

    import Swiper from 'swiper';
    import '../node_modules/swiper/dist/css/swiper.css';

    Css-loader у вас вроде подключен

    Можно алиас прописать в конфиге

    'swiper.css' : 'node_modules/swiper/dist/css/swiper.css'


    и импортировать покороче

    import 'swiper.css';

    Но вряд ли стоит заморачиваться ради единственного импорта
    Ответ написан
  • Как корректно преобразовывать html/стили для старых версий браузеров?

    delphinpro
    @delphinpro Куратор тега HTML
    frontend developer
    Верно ли, что просто поменяв значения в массиве настроек UTOPREFIXER_BROWSERS мы задаем поддержку

    Неверно. Потому что поддержка браузеров — это не только вендорные префиксы.
    Но в целом, да. Автопрефиксер расставит вам все необходимые -webkit- и т.п. свойства. Более того, он добавит некоторые другие свойства, например для поддержки старой спеки флексов, и удалит более неактуальные префиксы, если вы их написали вручную.

    Верно ли, что подобные плагины только лишь подставляют в нужных местах префиксы, и ничего более не делают?

    Вот это верно.
    Если вам нужны не только префиксы, но и полифилы, их нужно подключать самостоятельно. Однако, если вы используете webpack, то у него в комплекте уже есть куча полифилов. Например, поддержка for..of или spred-операторов. Они тоже по дефолту не подключаются, но можно подключить и использовать.

    как быть в случае html и тегов вроде header, да и прочих более менее новых html-вещей, поддержка которых браузерами вводилась не сразу?

    Полифил. Ищем нужный полифил и подключаем.
    Ответ написан
    Комментировать
  • Насколько хорошо необходимо знать Webpack и Gulp в web-разработке?

    delphinpro
    @delphinpro Куратор тега Gulp.js
    frontend developer
    Webpack заморочен, а с переходом на вторую версию старые мануалы/курсы/скринкасты имеют неточности вроде бы в незначительных мелочах, а ведь не работает!
    Но когда вы поймете как он работает, как его настроить, он станет вам незаменимым помощником. Использовать разумеется сразу вторую версию.
    Отдельно webpack имеет смысл использовать для сборки SPA и только. Для верстки обычного сайта без помощи таск-менеджера вам не обойтись. И тут на сцену выходит простой и надежный gulp, который и изучать-то особо не надо (если вы конечно не полный чайник в javascript). Он вам и скрипты сбилдит, и стили скомпилирует, и картинки оптимизирует, и спрайты соберет... Список можно продолжать до бесконечности. Без преувеличения.
    Более того, gulp может для вас и webpack запустить, если хочется обрабатывать javascript-файлы именно им. Они прекрасно дружат вместе.
    И не нужно там ничего заучивать. Добавьте пару закладок на документацию в браузер, почитайте/посмотрите несколько уроков, чтобы понять как в принципе настраивать инструмент. Потом делайте себе конфиги, удачные сохраняйте и переиспользуйте, расширяйте.
    Ответ написан
    5 комментариев
  • Вендорный код в отдельном файле, собственный - в отдельном. Можно ли таким образом настроить Browserify?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Я собирал вендоров отдельным таском. Вообще браузерифай оч редко использую, предпочитаю вебпак.
    Вот что-то типа такого у меня было https://gist.github.com/delphinpro/2442f25e3c2d2fa... для браузерифая.
    Ответ написан
    Комментировать
  • Как собрать проект gulp + vue файлы в один js и css?

    delphinpro
    @delphinpro Куратор тега Gulp.js
    frontend developer
    для строго очередного запуска попробуйте gulp-sequence

    var gulpSequence = require('gulp-sequence');
    var defaultTask = function (cb) {
        gulpSequence(['task1', 'task2'], ['task3', 'task4'], 'watch', cb);
    };

    task1 и task2 запустятся параллельно
    task3 и task4 тоже
    но сначала выполнится 1 и 2, потом 3 и 4, потом watch
    Ответ написан
    Комментировать