217 lines
4.9 KiB
JavaScript
217 lines
4.9 KiB
JavaScript
const chokidar = require('chokidar');
|
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
|
const path = require('path');
|
|
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
|
|
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
|
const FontPreloadPlugin = require('webpack-font-preload-plugin');
|
|
|
|
exports.configureDevServer = (serverAddress, publicPath, port, siteURL) => ({
|
|
allowedHosts: [ serverAddress ],
|
|
host: serverAddress,
|
|
client: {
|
|
logging: 'error',
|
|
progress: false,
|
|
overlay: {
|
|
errors: true,
|
|
warnings: false,
|
|
},
|
|
},
|
|
devMiddleware: {
|
|
publicPath: publicPath,
|
|
writeToDisk: (filePath) => {
|
|
return !(/hot-update/.test(filePath));
|
|
},
|
|
},
|
|
headers: {
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
|
|
'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization',
|
|
},
|
|
hot: true,
|
|
liveReload: true,
|
|
watchFiles: [
|
|
'../../**/*.tpl',
|
|
'../../modules/**/*.js',
|
|
'../../modules/**/*.css',
|
|
],
|
|
open: true,
|
|
port,
|
|
proxy: {
|
|
'**': {
|
|
target: siteURL,
|
|
secure: false,
|
|
changeOrigin: true,
|
|
}
|
|
},
|
|
static: {
|
|
publicPath: publicPath,
|
|
},
|
|
});
|
|
|
|
exports.extractScss = ({mode = 'production'}) => ({
|
|
module: {
|
|
rules: [{
|
|
test: /\.scss$/,
|
|
use: [
|
|
MiniCssExtractPlugin.loader,
|
|
'css-loader',
|
|
{
|
|
loader: 'postcss-loader',
|
|
options: {
|
|
postcssOptions: {
|
|
config: path.resolve(__dirname, 'postcss.config.js'),
|
|
},
|
|
}
|
|
},
|
|
{
|
|
loader: 'sass-loader',
|
|
options: {
|
|
implementation: require('sass'),
|
|
},
|
|
},
|
|
]
|
|
}]
|
|
},
|
|
plugins: [
|
|
new MiniCssExtractPlugin({
|
|
filename: 'css/[name].css',
|
|
chunkFilename: mode === 'production' ? 'css/[chunkhash].css' : 'css/[id].css',
|
|
}),
|
|
],
|
|
});
|
|
|
|
exports.extractJs = () => ({
|
|
module: {
|
|
rules: [
|
|
{
|
|
test: /swiper\.esm\.js/,
|
|
sideEffects: false
|
|
},
|
|
{
|
|
test: /\.js$/,
|
|
exclude: /(node_modules)/,
|
|
use: {
|
|
loader: 'esbuild-loader',
|
|
options: {
|
|
target: 'es2015'
|
|
}
|
|
}
|
|
},
|
|
]
|
|
}
|
|
});
|
|
|
|
exports.extractImages = ({ publicPath }) => ({
|
|
module: {
|
|
rules: [
|
|
{
|
|
test: /\.(png|jpg|gif|svg)$/,
|
|
use: [
|
|
{
|
|
loader: 'file-loader',
|
|
options: {
|
|
outputPath: 'img-dist/',
|
|
publicPath: publicPath + '/img-dist/',
|
|
name: '[contenthash].[ext]',
|
|
},
|
|
},
|
|
],
|
|
type: 'javascript/auto',
|
|
},
|
|
]
|
|
}
|
|
})
|
|
|
|
exports.extractFonts = ({ publicPath }) => ({
|
|
module: {
|
|
rules: [
|
|
{
|
|
test: /\.(woff|woff2|ttf|eot)$/,
|
|
use: [
|
|
{
|
|
loader: 'file-loader',
|
|
options: {
|
|
outputPath: 'fonts/',
|
|
publicPath: publicPath + '/fonts/',
|
|
name: '[name]-[contenthash].[ext]',
|
|
},
|
|
},
|
|
],
|
|
type: 'javascript/auto',
|
|
}
|
|
]
|
|
}
|
|
})
|
|
|
|
exports.extractVendorsChunks = () => ({
|
|
optimization: {
|
|
splitChunks: {
|
|
cacheGroups: {
|
|
swiper: {
|
|
test: /[\\/]node_modules[\\/](swiper|dom7)[\\/]/,
|
|
name: 'swipervendor',
|
|
filename: 'js/swipervendor.js',
|
|
chunks: 'initial',
|
|
}
|
|
},
|
|
},
|
|
},
|
|
})
|
|
|
|
exports.cleanDistFolders = () => ({
|
|
plugins: [
|
|
new CleanWebpackPlugin({
|
|
dry: false,
|
|
dangerouslyAllowCleanPatternsOutsideProject: true,
|
|
cleanOnceBeforeBuildPatterns: [
|
|
path.join(__dirname, '../../assets/js/**'),
|
|
path.join(__dirname, '../../assets/css/**'),
|
|
path.join(__dirname, '../../assets/img-dist/**'),
|
|
path.join(__dirname, '../../assets/fonts/**')
|
|
],
|
|
}),
|
|
]
|
|
})
|
|
|
|
exports.externals = () => ({
|
|
externals: {
|
|
prestashop: 'prestashop',
|
|
$: '$',
|
|
jquery : 'jQuery'
|
|
}
|
|
})
|
|
|
|
exports.preloadFonts = () => ({
|
|
plugins: [
|
|
new HtmlWebpackPlugin({
|
|
filename: 'preload.html',
|
|
templateContent: '{{{preloadLinks}}}',
|
|
inject: false,
|
|
}),
|
|
new FontPreloadPlugin({
|
|
index: 'preload.html',
|
|
extensions: ['woff2'],
|
|
filter: /(materialicons|roboto-v20-latin-ext_latin-regular|roboto-v20-latin-ext_latin-700|roboto-v20-latin-ext_latin-500|icomoon)/i,
|
|
replaceCallback: ({ indexSource, linksAsString }) => {
|
|
return indexSource.replace('{{{preloadLinks}}}', linksAsString);
|
|
},
|
|
}),
|
|
]
|
|
})
|
|
|
|
exports.resolve = () => ({
|
|
resolve: {
|
|
modules: [
|
|
'node_modules',
|
|
path.resolve('node_modules')
|
|
],
|
|
alias: {
|
|
'@node_modules': path.resolve(__dirname, '../node_modules'),
|
|
'@themeAbstract': path.resolve(__dirname, '../css/abstracts'),
|
|
'@css': path.resolve(__dirname, '../css'),
|
|
'@js': path.resolve(__dirname, '../js'),
|
|
}
|
|
},
|
|
});
|
|
|