202 lines
4.9 KiB
JavaScript
202 lines
4.9 KiB
JavaScript
const path = require('path')
|
|
const fs = require('fs')
|
|
const webpack = require('webpack');
|
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
|
|
const CopyWebpackPlugin = require('copy-webpack-plugin')
|
|
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
|
const { VueLoaderPlugin } = require('vue-loader')
|
|
const globImporter = require('node-sass-glob-importer');
|
|
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
|
|
const SpriteLoaderPlugin = require('svg-sprite-loader/plugin');
|
|
|
|
|
|
const PATHS = {
|
|
src: path.join(__dirname, '../src'),
|
|
dist: path.join(__dirname, '../dist'),
|
|
assets: 'assets/',
|
|
fonts: 'assets/fonts',
|
|
img: 'assets/img',
|
|
sprites:'assets/sprites/',
|
|
svgicon:'../src/assets/svg-icon/',
|
|
svgcoloricon:'../src/assets/svg-color-icon/',
|
|
}
|
|
|
|
const PAGES_DIR = `${PATHS.src}/pug/pages/`
|
|
const PAGES = fs.readdirSync(PAGES_DIR).filter(fileName => fileName.endsWith('.pug'))
|
|
|
|
module.exports = {
|
|
externals: {
|
|
paths: PATHS
|
|
},
|
|
entry: {
|
|
app: PATHS.src,
|
|
// module: `${PATHS.src}/your-module.js`,
|
|
},
|
|
output: {
|
|
filename: `${PATHS.assets}js/[name].js`,
|
|
path: PATHS.dist,
|
|
},
|
|
optimization: {
|
|
// minimize: false,
|
|
splitChunks: {
|
|
cacheGroups: {
|
|
vendor: {
|
|
name: 'vendors',
|
|
test: /node_modules/,
|
|
chunks: 'all',
|
|
enforce: true
|
|
}
|
|
}
|
|
}
|
|
},
|
|
module: {
|
|
rules: [{
|
|
test: /\.pug$/,
|
|
loader: 'pug-loader',
|
|
options:{
|
|
pretty: '\t'
|
|
}
|
|
}, {
|
|
test: /\.js$/,
|
|
loader: 'babel-loader',
|
|
exclude: '/node_modules/'
|
|
}, {
|
|
test: /\.vue$/,
|
|
loader: 'vue-loader',
|
|
options: {
|
|
loader: {
|
|
scss: 'vue-style-loader!css-loader!sass-loader'
|
|
}
|
|
}
|
|
}, {
|
|
test: /\.(woff(2)?|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/,
|
|
loader: 'file-loader',
|
|
options: {
|
|
name: '[name].[ext]',
|
|
outputPath: PATHS.fonts,
|
|
publicPath: '../fonts/'
|
|
}
|
|
}, {
|
|
test: /\.(png|jpg|gif)$/,
|
|
loader: 'file-loader',
|
|
options: {
|
|
name: '[name].[ext]',
|
|
outputPath: PATHS.img,
|
|
publicPath: '../img/'
|
|
}
|
|
},
|
|
{
|
|
test: /\.svg$/,
|
|
include: [
|
|
path.resolve(__dirname, PATHS.svgicon),
|
|
],
|
|
use:[{
|
|
loader: 'svg-sprite-loader',
|
|
options: {
|
|
esModule: false,
|
|
extract: true,
|
|
spriteFilename: 'sprite.svg',
|
|
// outputPath: PATHS.sprites,
|
|
publicPath: PATHS.sprites,
|
|
}
|
|
},{
|
|
loader: 'svgo-loader',
|
|
options: {
|
|
plugins: [
|
|
{ removeNonInheritableGroupAttrs: true },
|
|
{ collapseGroups: true },
|
|
{ removeAttrs: { attrs: '(fill|stroke)' } },
|
|
]
|
|
}
|
|
}]
|
|
},
|
|
{
|
|
test: /\.svg$/,
|
|
include: [
|
|
path.resolve(__dirname, PATHS.svgcoloricon),
|
|
],
|
|
use:[{
|
|
loader: 'svg-sprite-loader',
|
|
options: {
|
|
esModule: false,
|
|
extract: true,
|
|
spriteFilename: 'spritecolor.svg',
|
|
// outputPath: PATHS.sprites,
|
|
publicPath: PATHS.sprites,
|
|
}
|
|
},{
|
|
loader: 'svgo-loader',
|
|
options: {
|
|
plugins: [
|
|
{ removeNonInheritableGroupAttrs: true },
|
|
{ collapseGroups: true },
|
|
]
|
|
}
|
|
}]
|
|
},
|
|
|
|
{
|
|
test: /\.scss$/,
|
|
use: [
|
|
'style-loader',
|
|
MiniCssExtractPlugin.loader,
|
|
{
|
|
loader: 'css-loader',
|
|
options: { sourceMap: true }
|
|
}, {
|
|
loader: 'postcss-loader',
|
|
options: { sourceMap: true, config: { path: `./conf/postcss.config.js` } }
|
|
}, {
|
|
loader: 'sass-loader',
|
|
options: {
|
|
sourceMap: true,
|
|
// importer: globImporter()
|
|
}
|
|
}
|
|
]
|
|
}, {
|
|
test: /\.css$/,
|
|
use: [
|
|
'style-loader',
|
|
MiniCssExtractPlugin.loader,
|
|
{
|
|
loader: 'css-loader',
|
|
options: { sourceMap: true }
|
|
}, {
|
|
loader: 'postcss-loader',
|
|
options: { sourceMap: true, config: { path: `./conf/postcss.config.js` } }
|
|
}
|
|
]
|
|
}]
|
|
},
|
|
resolve: {
|
|
alias: {
|
|
'~': PATHS.src,
|
|
'vue$': 'vue/dist/vue.js',
|
|
}
|
|
},
|
|
plugins: [
|
|
new CleanWebpackPlugin(),
|
|
new webpack.ProvidePlugin({
|
|
$: 'jquery',
|
|
jQuery: 'jquery'
|
|
}),
|
|
new VueLoaderPlugin(),
|
|
new MiniCssExtractPlugin({
|
|
filename: `${PATHS.assets}css/[name].css`,
|
|
}),
|
|
new SpriteLoaderPlugin({
|
|
plainSprite: true
|
|
}),
|
|
new CopyWebpackPlugin([
|
|
{ from: `${PATHS.src}/${PATHS.assets}img`, to: `${PATHS.assets}img` },
|
|
// { from: `${PATHS.src}/${PATHS.assets}fonts`, to: `${PATHS.assets}fonts` },
|
|
// { from: `${PATHS.src}/static`, to: '' },
|
|
]),
|
|
...PAGES.map(page => new HtmlWebpackPlugin({
|
|
template: `${PAGES_DIR}/${page}`,
|
|
filename: `./${page.replace(/\.pug/,'.html')}`
|
|
}))
|
|
],
|
|
}
|