nsmrf/conf/webpack.base.conf.js

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')}`
}))
],
}