Javascript-форум (https://javascript.ru/forum/)
-   Сборка проекта, утилиты (https://javascript.ru/forum/server-tools/)
-   -   Webpack'а тред (https://javascript.ru/forum/server-tools/53907-webpack%27-tred.html)

nerv_ 23.02.2015 11:41

Webpack'а тред
 
Открою тред вопросом по source-map.

Текущая генерация карт ставит под вопрос безопасность.
Первое упоминание этого вопроса мной
Более подробное описание вопроса

Кто виноват и что делать? :)

nerv_ 05.03.2015 11:23

Попытаюсь задать еще один вопрос: как прописать конфигурацию веб-пака, чтобы он выдавал полную и минифицированную версию?
для гранта конфиг выглядит так

// webpack
// [url]http://babeljs.io/docs/using-babel/#webpack[/url]
// [url]https://github.com/webpack/grunt-webpack[/url]
webpack: {
    // common
    options: {
        entry: {
            common: ENTRY_PATH,
        },
        output: {
            path: OUTPUT_PATH,
            filename: '[name].js'
        },
        module: {
            loaders: [
                // [url]https://github.com/babel/babel-loader[/url]
                {test: /\.js$/, loader: 'babel'},
                // [url]https://github.com/webpack/json-loader[/url]
                {test: /\.json$/, loader: 'json'},
                // [url]https://github.com/webpack/html-loader[/url]
                {test: /\.html$/, loader: 'html'}
            ]
        },
        plugins: [
            new webpack.optimize.UglifyJsPlugin()
        ]
    }
}

Соответственно, как только я подключаю плагин UglifyJs, получаю сжатую версию. Хотелось бы и ту и другую и не копировать конфиг :)

Gozar 05.03.2015 13:16

Тоже хотел бы знать ответ. :)

melky 05.03.2015 15:06

Цитата:

Сообщение от Gozar (Сообщение 359703)
Тоже хотел бы знать ответ. :)

ларчик просто открывается

конфиги вебпака - исполняемые файлы, возвращающие массив настроек или настройки сборки

создайте вызываемый файл фабрики конфига и передавайте фабрики параметры, для гибкости

пример показать?

Gozar 05.03.2015 18:22

Цитата:

Сообщение от melky
пример показать?

Да, было бы здорово.

nerv_ 05.03.2015 18:49

Цитата:

Сообщение от Gozar
Да, было бы здорово

А вообще я сейчас подумал, нафига мне несжатая версия, если есть source-map? :)
В самых крайних случаях для отладки можно просто настройку сжатия в конфиге комментить)

melky 06.03.2015 12:05

Цитата:

Сообщение от Gozar (Сообщение 359750)
Да, было бы здорово.

базовый конфиг webpack.config.base.js:
/////////////////////////////////////////////////////////////////////
////                                                             ////
////        БАЗОВЫЙ ФАЙЛ ДЛЯ СОЗДАНИЯ КОНФИГУРАЦИИ СБОРКИ        ////
////                                                             ////
/////////////////////////////////////////////////////////////////////

'use strict';
var webpack = require('webpack');
var path = require('path');
var ExtractTextPlugin = require("extract-text-webpack-plugin");

// частицы сборки конфига
var makers = {

  // массив лоадеров
  loaders: function (specific, common) {

    var loaders = []
    var add = function (loader) { loaders.push(loader) }

    // общие плагин. экспорт переменных в ГО
    add({test: /(react)|(react\/addons)$/, loader: 'expose?React'})
    add({test: /\/jquery.js$/, loader: 'expose?jQuery'})
    add({test: /\.json$/, loader: "json"})

    // ES6 и JSX
    add({test: /(\.jsx)|(\.js)$/, exclude: /(node_modules)|(vendor)/, loader: 'babel'})

    // разметка
    if (specific.html) {
      add({ test: /\.html/, loader: 'html?attrs=link:href' })
    }

    // стили
    if (common.extractText) {
      add({test: /\.css$/, loader:  ExtractTextPlugin.extract("style", "css!autoprefixer")})
      add({test: /\.styl$/, loader: ExtractTextPlugin.extract("style", "css!autoprefixer!stylus")})
      add({test: /\.less$/, loader: ExtractTextPlugin.extract("style", "css!autoprefixer!less")})
    } else {
      add({test: /\.css$/, loader: "style!css!autoprefixer"})
      add({test: /\.styl$/, loader: "style!css!autoprefixer!stylus"})
      add({test: /\.less$/, loader: "style!css!autoprefixer!less"})
    }

    // картинки
    if (specific.images) {
      add({test: /\.(png|jpg|gif)$/, loader: 'file?limit=8192'})
    }

    // шрифты
    if (specific.fonts) {
      add({test: /\.woff.?$/, exclude: /vendor/, loader: "file?limit=10000&minetype=application/font-woff" })
      add({test: /fonts\/.*\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, exclude: /vendor/, loader: "file"})
    }

    if (specific.inlineSVGIcons) {
      add({test: /icon-.+\.(svg)$/, exclude: /(node_modules)|(vendor)/, loader: 'raw'})
    }

    if (specific.kendo) {
      add({test: /kendo\-ui\-core[\///].*\.js$/, loader: "imports?jQuery=jquery"})
    }

    return loaders
  },

  // массив плагинов
  plugins: function (specific, common) {

    var plugins = []
    var add = function (plugin) { plugins.push(plugin) }

    add(new webpack.NoErrorsPlugin())

    if (common.extractText) {
      add(new ExtractTextPlugin("[name].css"))
    }

    if (specific.prefetch && specific.prefetch.length) {
      specific.prefetch.forEach(function (prefetchModule) {
        add(new webpack.PrefetchPlugin(prefetchModule))
      })
    }

    if (specific.hot) {
      add(new webpack.HotModuleReplacementPlugin())
    }

    if (specific.provide) {
      add(new webpack.ProvidePlugin(specific.provide))
    }

    if (specific.define) {
      add(new webpack.DefinePlugin(specific.define))
    }

    return plugins
  },

  preLoaders: function (specific, common) {
    var preLoaders = []
    var add = function (preloader) { preLoaders.push(preloader) }

    add({test: /\.js$/, exclude: /(node_modules)|(bootstrap.config)/, loader: "source-map"})

    if (specific.globals) {
      add({test: /src\/scripts\/.+(\.jsx)|(\.js)$/, exclude: /(node_modules)|(admin)\//, loader: 'imports?globals=scripts/globals.js'})
    }

    return preLoaders
  },

}

module.exports = function makeWebpackConfig (options) {

  return  {

    plugins: makers.plugins(options.plugins || {}, options),

    output: {
      pathinfo: true,
      filename: '[name].js',
      // publicPath: '/assets/'
    },

    entry: options.entry,

    cache: true,
    debug: true,
    devtool: '#source-map',

    stats: {
      timings: true,
      colors: true,
      reasons: true
    },

    resolve: {
      root: __dirname,
      alias: options.aliases,
    },

    module: {
      preLoaders: makers.preLoaders(options.preLoaders || {}, options),
      loaders: makers.loaders(options.loaders || {}, options),
      noParse: [/js\/vendor/]
    },

    node: {
      buffer: false
    }

  }

}


Сборка разработки:
///////////////////////////////////////////////////////////
////                                                   ////
////        КОНФИГУРАЦИЯ WEBPACK ДЛЯ РАЗРАБОТКИ        ////
////                                                   ////
///////////////////////////////////////////////////////////

var path = require('path');

// фабрика конфигурации
var makeConfig = require('./webpack.config.base.js');

// клиентское приложение
var client = makeConfig({
  extractText: true,
  entry: {
    'main': [
      // 'webpack/hot/only-dev-server',
      'webpack/hot/dev-server',
      // "bootstrap-webpack!./bootstrap.config.js",
      './js/main-webpack.js'
    ]
  },
  plugins: {
    hot: true,
    provide: {
      'jQuery': 'jquery',
    },
    define: {
      'global.BACKEND_HOST': '"http://localhost:8080/"',
      'process.env.NODE_ENV': '"development"',
      'global.SIDE': '"frontend"',
      'process.env.BLUEBIRD_DEBUG': '1',
      '__DEV__': 'true',
    },
  },
  loaders: {
    html: true,
    images: true,
    fonts: true,
  }
});

module.exports = [client];


ну, для продакшена нету, но идею можно уловить :)

melky 10.03.2015 13:34

WEBPACK 2

kobezzza 12.03.2015 21:45

Разбираюсь с WebPack и встал вопрос: а нахрена нужны всякие CSS лоадеры и т.д. это же жесть получается: помещаем наш CSS в JS Оо

nerv_ 12.03.2015 21:48

Цитата:

Сообщение от kobezzza
Разбираюсь с WebPack и встал вопрос: а нахрена нужны всякие CSS лоадеры и т.д. это же жесть получается: помещаем наш CSS в JS Оо

видимо, чтобы из компонет проект собирать
сам использую .js, .json, .html
в последнем описываются шаблоны (чтобы не аяксить)

Gozar 12.03.2015 22:04

Цитата:

Сообщение от kobezzza
жесть получается: помещаем наш CSS в JS

Да, жесть. В jsx тоже можно css-сить, но лучше классами :)

melky 13.03.2015 10:27

Цитата:

Сообщение от kobezzza (Сообщение 360999)
Разбираюсь с WebPack и встал вопрос: а нахрена нужны всякие CSS лоадеры и т.д. это же жесть получается: помещаем наш CSS в JS Оо

можно и пикчи в JS класть :)

т.е. то, что он так делает - это хорошо. вы требуете (require) один файл (например, компонент КНОПКИ), а он автоматически подтянет свои стили и другие ресурсы - согласитесь, меньше запарок)

бутстрапчег подключать заметно легче... или вообще что-то, что тянет за собой спектр зависимостей

да, модуль начинает тянуть за собой CSS, JS, библиотеки, картинки, шрифты и остальное (причём можно указать, чтобы он это не скачивал, а размещал прямо в скрипте, через dataUrl)

иногда это полезно (для разработки), иногда - нет (для продакшена, ваш К.О.).

для извлечения стилей в отдельный файл есть плагин ExtractTextPlugin

для копирования ресурсов есть file-loader, для включения содержимого файла в data url - url-loader, для включения голого содержимого файла - raw-loader

kobezzza 13.03.2015 11:37

melky, понял, спасибо.

***

Ещё вопрос: разбираюсь с чанковой сборкой, а именно с common чанками и вот такая трабла:

webpack({
	context: path.resolve(__dirname, 'app'),

	entry: {
		app: './index',
		base: './base'
	},

	output: {
		path: path.resolve(__dirname, 'dist'),
		filename: '[name].js'
	},

	module: {
		loaders: [
			{
				test: /\.js$/,
				exclude: /node_modules/,
				loader: 'babel-loader'
			}
		]
	},

	plugins: [
		new webpack.optimize.CommonsChunkPlugin({
			name: 'base'
		})
	]

}, function (err) {
	if (err) {
		console.error(err);
	}
});


Не работает, вываливается с ошибкой в app, мол ./index не существует, но если base записать как массив, то всё ок

base: ['./base']


Баг или фича?

melky 14.03.2015 20:27

Цитата:

Сообщение от kobezzza
Баг или фича?

хз :) а если прописать еще и расширение файла?

kobezzza 14.03.2015 20:43

Цитата:

Сообщение от melky (Сообщение 361273)
хз :) а если прописать еще и расширение файла?

Тоже самое :-E Ну так или иначе, в форме массива оно работает.

nerv_ 19.03.2015 14:30

оказывается, webpack умеет umd =)

nerv_ 12.07.2015 10:17

Как писать таски для gulp на es6
 
package.json (для винды)
{
    "scripts": {
        "gulpes6": "./node_modules/.bin/webpack.cmd --progress --colors --config webpack.gulpfile.js",
    }
}

gulpfile.es6
import gulp from 'gulp';
// обязательно именно так "from gulp"
// если писать по другому, вебпак будет пытается запихнуть в bundle

webpack.gulpfile.js
'use strict';

var fs = require("fs");

module.exports = {
    entry: './gulpfile.es6',
    target: 'node',
    externals: fs.readdirSync('node_modules'),
    output: {
        path: './',
        filename: 'gulpfile.js',
        libraryTarget: 'commonjs'
    },
    module: {
        loaders: [
            // [url]https://github.com/babel/babel-loader[/url]
            {test: /\.(?:es6|js)$/, loader: 'babel'}
        ]
    }
};


запускаем в терминале
npm run gulpes6

будет собран gulpfile.js из gulpfile.es6
после чего можно запускать таски галпа обычным способом(через терминал или IDE)


по материалам ссылка

nerv_ 24.07.2015 01:30

этот конфиг на примере gulp'а:

package.json
{
    "name": "project_name",
    "version": "0.0.0",
    "private": true,
    "description": "",
    "dependencies": {
        "babel": "^4.7.16",
        "babel-loader": "^4.0.0",
        "json-loader": "^0.5.1",
        "html-loader": "^0.2.3",
        "gulp": "^3.9.0",
        "webpack": "^1.10.1",
        "webpack-stream": "^2.0.0"
    },
    "scripts": {
    }
}


gulpfile.js
// [url]https://github.com/gulpjs/gulp/blob/master/docs/README.md[/url]
var gulp = require('gulp');
// [url]http://webpack.github.io/docs/[/url]
var webpack = require('webpack');
// [url]https://github.com/shama/webpack-stream[/url]
var webpackStream = require('webpack-stream');


gulp.task(
    'xmlmarket/build',
    function() {
        return gulp
            .src('./httpdocs/js/angular/application/modules/xmlmarket/module.js')
            .pipe(webpackStream({
                module: {
                    loaders: [
                        // [url]https://github.com/babel/babel-loader[/url]
                        {test: /\.js$/, loader: 'babel'},
                        // [url]https://github.com/webpack/json-loader[/url]
                        {test: /\.json$/, loader: 'json'},
                        // [url]https://github.com/webpack/html-loader[/url]
                        {test: /\.html$/, loader: 'html'}
                    ]
                },
                plugins: [
                    // [url]http://webpack.github.io/docs/list-of-plugins.html#uglifyjsplugin[/url]
                    new webpack.optimize.UglifyJsPlugin({
                        compress: {
                            warnings: false
                        }
                    })
                ],
                devtool: 'source-map',
                debug: true,
                output: {
                    filename: 'angular-xmlmarket.min.js'
                }
            }))
            .pipe(gulp.dest('./httpdocs/js/angular/modules/'));
    }
);


gulp.task(
    'xmlmarket/watch', function() {
        return gulp
            .watch(
                [
                    './httpdocs/js/angular/application/modules/xmlmarket/**/*.js',
                    './httpdocs/js/angular/application/modules/xmlmarket/**/*.json',
                    './httpdocs/js/angular/application/modules/xmlmarket/**/*.html'
                ],
                [
                    'xmlmarket/build'
                ]
        );
    }
);

cyber 10.08.2015 14:28

как заставить webpack игнорить ошибки, т.е если он не нашел require("module") то он так и оставил, а не заменял на ошибку

kobezzza 10.08.2015 23:51

Цитата:

Сообщение от cyber (Сообщение 383486)
как заставить webpack игнорить ошибки, т.е если он не нашел require("module") то он так и оставил, а не заменял на ошибку

http://webpack.github.io/docs/list-o...l#ignoreplugin

cyber 11.08.2015 07:57

kobezzza, я знаю об этой штуке, но она всеравно вставляет ошибки если модуля нет.

kobezzza 11.08.2015 10:24

Цитата:

Сообщение от cyber (Сообщение 383559)
kobezzza, я знаю об этой штуке, но она всеравно вставляет ошибки если модуля нет.

Странно, покажи свой конфиг.

cyber 11.08.2015 10:31

kobezzza, еще не много бардак, я его переделываю по 200 раз)

var ignore = new webpack.IgnorePlugin( /columnUtils/g );

  webpack ( {
    // context: path.join( __dirname, "utils" ),
    context: __dirname,
    debug: true,
    devtool: 'source-map',
    // entry: "./utils.core.js" ,
    entry: "./core.js" ,
    output: {
      // filename: "utils.js",
      filename: "app.c.js",
      // sourceMapFilename: "dist/widget.sourcemap.js"
    },
    resolve: {
      // modulesDirectories: [ path.resolve( __dirname,  ".." ),  path.resolve( __dirname,  "..", "cultures" ), path.resolve( __dirname,  "..", "..", "_libs", "cultures/kendoui/cultures" ) ],
      modulesDirectories: [ path.join( __dirname,  "utils" ), path.join( __dirname,  "libs" ) ],
    },
    module: {
     loaders: [
         { test: "/\.js$/", loader: "c-loader" }
     ],
     plugins: [
       ignore
     ]
   }
  }, function (err) {
    // gulp.run( "compress" );
    callback();
  } );

kobezzza 11.08.2015 14:30

cyber, вечером гляну

cyber 11.08.2015 15:13

kobezzza, thanks)

cyber 11.08.2015 16:51

Я так понимаю вебпак ломает от таких зависимостий?
точнее добавляет ошибку как будето app.js нету
app.js
{
  xx: require("./x/xxx"),
  yy: require("./y/yyy")
}


xx.js
require( "../app" ).yy


П.с как такие зависимости называются на англ?

kobezzza 11.08.2015 19:49

Исключение файлов из сборки:

var webpack = require('webpack');

module.exports = {
	context: __dirname,
	entry: './index',
	externals: [
		/sub/
	],
	output: {
		libraryTarget: 'commonjs',
		path: __dirname + '/dist',
		filename: 'bundle.js'
	}
};


http://webpack.github.io/docs/config...html#externals
http://webpack.github.io/docs/librar...externals.html

kobezzza 11.08.2015 19:52

Цитата:

Я так понимаю вебпак ломает от таких зависимостий?
Ничё не понял, что ты хочешь )

Веб-пак очень умный, но его нужно правильно настроить.

cyber 11.08.2015 22:09

Цитата:

Сообщение от kobezzza
Исключение файлов из сборки:

спасибо попробую
Цитата:

Сообщение от kobezzza
Ничё не понял, что ты хочешь )

У тебя меня ессть главный файл, он подключает к себе другой файл а тот файл подключает главный файл который подключает его

kobezzza 12.08.2015 09:48

Цитата:

У тебя меня ессть главный файл, он подключает к себе другой файл а тот файл подключает главный файл который подключает его
А, ты про круговые ссылки? Я как то это решал на веб-паке, вечером гляну.

cyber 12.08.2015 10:33

Цитата:

Сообщение от kobezzza
А, ты про круговые ссылки?

Да, спасибо

kobezzza 13.08.2015 21:30

Цитата:

Сообщение от cyber (Сообщение 383789)
Да, спасибо

Блин, сорян, я второй день прихожу адски заёбаный с работы :(

cyber 13.08.2015 22:57

Цитата:

Сообщение от kobezzza
Блин, сорян, я второй день прихожу адски заёбаный с работы

Я тебя прекрасно понимаю, я просто сказал не юзать круговые ссылки, но если будет время то скинь плиз)

cyber 14.08.2015 11:19

Короче долго не мог понять почему вебпак собирает с 150кб, 3 мб, окзалось у меня в папке лежал gulpfile и его тоже подключало, и оно подключало код из исходников ноды который тоже собирался)

kobezzza 16.08.2015 08:41

Цитата:

Сообщение от cyber (Сообщение 384221)
Короче долго не мог понять почему вебпак собирает с 150кб, 3 мб, окзалось у меня в папке лежал gulpfile и его тоже подключало, и оно подключало код из исходников ноды который тоже собирался)

Ну добавь его в исключение, я показывал как это сделать выше.

kobezzza 16.08.2015 15:46

По поводу цикличных ссылок:
https://github.com/webpack/webpack/issues/300

Т.е. разводим файлы на разные бандлы или ждём webpack-2 :)

cyber 17.08.2015 08:48

Цитата:

Сообщение от kobezzza
Ну добавь его в исключение, я показывал как это сделать выше.

Так и сделал, просто интересно как он модули ноды нашел)
Цитата:

Сообщение от kobezzza
По поводу цикличных ссылок:
https://github.com/webpack/webpack/issues/300

Т.е. разводим файлы на разные бандлы или ждём webpack-2

спасибо)

Lemme 30.08.2015 14:57

Объясните мне суть WebPack'a, то, что он собирает js, css это я знаю, то, что webpack сборщик модулей, это я тоже знаю. Но меня вводит в недоумение от непонимания его использование совместно с gulp'ом.

Ведь, gulp может все тоже самое, что и WebPack, зачем их использовать вместе? :blink:

А, как говорится - модульность? Дак:

es6+babel = модульность в js
stylus и так умеет импорить, а если сравнивать без препроцессора, то gulp-minify-css, преобразует импорты в подключение css файла.
для html jade имеет include, а без него использовать https://www.npmjs.com/package/gulp-rigger
этот плагин ваще подключит все что угодно, куда угодно...

Мб я на него не так смотрю, ткните носом. =)

Erolast 30.08.2015 16:24

Цитата:

Ведь, gulp может все тоже самое, что и WebPack, зачем их использовать вместе?
Не может. Это разные инструменты.

gulp - раннер каких угодно тасков, от чистки ./tmp до деплоймента, хоть и использующийся обычно для сборки.
webpack специализирован исключительно для сборки.

Смысл использовать вебпак совместно с гульпом есть, если в проекте кроме сборки требуются еще какие-то таски.

Lemme 30.08.2015 16:53

Цитата:

требуются еще какие-то таски
Например?

К примеру, задачу минификации картинок, webpack вряд ли выполнит, в смысле, не потому, что это нереально, а судя по его идее.

А вот к примеру "собрать спрайт" из папки в файл sprite.png и все данные о спрайте вынести в миксины и переменные какого-то препроцессора?


Часовой пояс GMT +3, время: 02:49.