const fs = require('fs') const path = require('path') const spritesmithPlugin = require('webpack-spritesmith') // 基础路径 注意发布之前要先修改这里 const spritesmithTasks = [] fs.readdirSync('src/assets/sprites').map(dirname => { if (fs.statSync(`src/assets/sprites/${dirname}`).isDirectory()) { spritesmithTasks.push( new spritesmithPlugin({ src: { cwd: path.resolve(__dirname, `src/assets/sprites/${dirname}`), glob: '*.png' }, target: { image: path.resolve(__dirname, `src/assets/sprites/${dirname}.[hash].png`), css: [ [path.resolve(__dirname, `src/assets/sprites/_${dirname}.scss`), { format: 'handlebars_based_template', spritesheetName: dirname }] ] }, customTemplates: { 'handlebars_based_template': path.resolve(__dirname, 'scss.template.handlebars') }, // 样式文件中调用雪碧图地址写法 apiOptions: { cssImageRef: `~${dirname}.[hash].png` }, spritesmithOptions: { algorithm: 'binary-tree', padding: 10 } }) ) } }) module.exports = { publicPath: '', lintOnSave: true, devServer: { open: true, host: '0.0.0.0', port: '8080', proxy: { '/api': { target: 'http://localhost:8999', // 要请求的地址 ws: true, changeOrigin: true, pathRewrite: { '^/api': '/api' } } } }, configureWebpack: { resolve: { modules: ['node_modules', 'assets/sprites'] }, plugins: [ ...spritesmithTasks ] }, chainWebpack: config => { const oneOfsMap = config.module.rule('scss').oneOfs.store oneOfsMap.forEach(item => { item.use('sass-resources-loader') .loader('sass-resources-loader') .options({ resources: [ './src/assets/styles/resources/*.scss', './src/assets/sprites/*.scss' ] }) .end() }) config.module .rule('svg') .exclude.add(path.join(__dirname, 'src/assets/icons')) .end() config.module .rule('icons') .test(/\.svg$/) .include.add(path.join(__dirname, 'src/assets/icons')) .end() .use('svg-sprite-loader') .loader('svg-sprite-loader') .options({ symbolId: 'icon-[name]' }) .end() } }