Webpack
Содержание
Делаем package.json в проекте
npm init
Установим Webpack
npm i webpack -g
Как подключить в Bundle пакеты
npm install jquery-validate --save
; require('jquery-validate');
Собирам JS в один файл (Bundling JS)
Создаем 2 скрипта и страницу для теста. Синтаксис в скриптах как в NodeJS.
script.js
var script1 = require("./script1")
alert(script1.msg)
script1.js
module.exports = {
msg: "Hello from script1",
}
Собираем Bundle и подключаем
cmd> webpack ./script.js ./bundle.js
index.html
<html>
....
<!-- script.js + script1.js -->
<script src="bundle.js"></script>
</body>
</html>
Webpack.config.js
Нужен для сборки всего и вся одной коммандой:
webpack
webpack.config.js
var webpack = require("webpack"); // need be installed in project
var path = require('path');
module.exports = {
// входная точка
// главный файл в котором будут все другие подклюачться
entry: './src/script.js',
// куда складывать собранные файлы
output: {
path: path.resolve('./src/findjob/public/js/fns/'),
filename: "bundle.js"
}
// minify bundle
plugins: [
new webpack.optimize.UglifyJsPlugin({minimize: true})
]
};
Babel-loader (ES2015)
Установим пре-процессоры для компила EcmaScripts
npm i babel-core babel-loade babel-preset-es2015 --save-dev
webpack.config.js
module.exports = {
// входная точка
// главный файл в котором будут все другие подклюачться
entry: './src/script.js',
// куда складывать собранные файлы
output: {
path: "assets",
filename: "bundle.js"
},
// модули (обычный alert() - перестанет работать)
module:{
loaders: [{
test:/\.js$/,
exclude: /(node_modules)/,
loader: 'babel-loader',
query: {
presets: ['es2015']
}
}]
},
};
cmd> webpack
CSS-loader & Style-loader
Установка
npm i style-loader css-loader --save-dev
Создаем стили
ma-styles.css
.ma-style{ color:black; }
Добавить в секцию module -> loaders:[->]
webpack.config.js
loaders: [
{
test:/\.css$/, // regular expression
loader: 'style-loader!css-loader' // используеться оба модуля
},
]
Подключаем в скрипт(omg) и юзаем на странице стили
script.js
require('./css/ma-styles.css');
cmd> webpack
SASS-loader
Установка
npm i node-sass sass-loader --save-dev
Добавить в секцию module -> loaders:[->]
webpack.config.js
loaders: [
{
test:/\.css$/, // regular expression
loader: 'style-loader!css-loader!sass-loader'
},
]
Подключаем в скрипт(omg) и юзаем на странице стили
script.js
require('./css/ma-styles.scss');
cmd> webpack
Jquery include
entry.js
var $ = require("jquery");
window.jQuery = $;
window.$ = $;
JS Bundle & SASS Compile
packages - css-loader, extract-text-webpack-plugin, gulp-sass, node-sass, sass-loader, webpack
webpack.config.js
var path = require('path');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var extractPlugin = new ExtractTextPlugin({
filename: 'index.css'
});
module.exports = {
entry: './public/gather.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
publicPath: '/dist'
},
module: {
rules: [
/*
your other rules for JavaScript transpiling go in here
*/
// { // regular css files
// test: /\.css$/,
// loader: ExtractTextPlugin.extract({
// loader: 'css-loader?importLoaders=1',
// }),
// },
{ // sass / scss loader for webpack
test: /\.(sass|scss)$/,
// test: /\.scss$/,
use: extractPlugin.extract({
use:['css-loader', 'sass-loader']
})
// loader: ExtractTextPlugin.extract(['css-loader', 'sass-loader'])
}
]
},
plugins: [
extractPlugin
],
};
public/gather.js
// Sass
import './sass/index.scss'; // it will compile to - 'dist/index.css'
// JS
import './js/main.js'; // it will bundle to - 'dist/bundle.js'
Все связи типа require - работаю только в тех файлах которые пакуються webpack'om, тоесть если собрать bundle и подключить в страницу, а ниже подключить файл который будет запрашывать переменную из файла который запакован в bundle, будет ошибка. Но можно сделать запакованные функции доступными в html.(Показано в примере ниже) Все подключение(require) происходит по примеру работы с NodeJS.
gather.js
// подключение jq
var $ = require("jquery");
window.jQuery = $;
window.$ = $;
// подключение booter
require('bootstrap');
// подключение моих JS
require('./js/some.js');
// вот так можно сделать доступ к своим ф-циям в html (доступ через объект - Main.myfunc(), Main.myvar)
var main = require('./js/main.js');
window.Main = main;
some.js (main.js лежит вместе с some.js)
var Main = require('./main.js'); //
console.log('hi from some')
alert(Main.SomeArr.hello);
main.js
console.log('hi from main')
var SomeArr = { hello: 'greeting' }
module.exports = { SomeArr: SomeArr }
index.html
...
<script src="dist/bundle.js"></script>
<script src="js/not_webpacked.js"></script> <!-- В этом файле нельзя будет взять SomeArr из main.js, так как запокован -->
<script>
alert(Main.SomeArr) // это будет работать , так глобалное
</script>