@wbi/cli-service
Version:
local service for wb-cli projects
188 lines (177 loc) • 5.57 kB
JavaScript
/**
* Created by jerry.lin-wun on 2019/1/25.
* webpack基础配置
*/
const path = require('path')
const webpack = require('webpack')
const HappyPack = require('happypack')
const utils = require('./utils')
const wbConfig = utils.wbConfig
module.exports = function (opts = {}) {
// 获得static资源路径
const {staticPath, commonStaticPath} = utils.getStaticPath(opts)
// 解析静态资源,将{staticPath}替换成真实的资源路径
const staticAssets = utils.copyObject(true, {}, wbConfig.staticAssets)
const commonStaticAssets = utils.copyObject(true, {}, wbConfig.commonStaticAssets)
utils.parseStaticAssets('{staticPath}', staticPath, staticAssets)
utils.parseStaticAssets('{commonStaticPath}', commonStaticPath, commonStaticAssets)
// 修改main.scss的$staticPath、$commonStaticPath路径
utils.modifyStyleStaticPath(staticPath, commonStaticPath)
return {
entry: {
main: './src/main.js'
},
output: {
path: utils.resolve('./dist'),
filename: 'assets/js/[name].[hash:7].js',
chunkFilename: 'assets/js/[name].[hash:7].js',
// 所有资源的基础路径,而且一定要以 / 结尾
// 一般建议填写 / 或者 ./
publicPath: wbConfig.publicPath.dev
},
resolve: {
// 使用绝对路径指明第三方模块存放的位置,以减少搜索步骤
modules: [utils.resolve('./node_modules')],
// 只采用 main、jsnext:main 字段作为入口文件描述字段,以减少搜索步骤
mainFields: ['jsnext:main', 'main', 'browser'],
// 别名
alias: {
// 指向src路径
'@': utils.resolve('./src'),
// 指向src/components
'@c': utils.resolve('../componentServer/components')
}
},
plugins: [
new webpack.ProvidePlugin({
// jQuery: 'jquery',
// $: 'jquery',
Swiper: 'swiper/dist/js/swiper.js'
}),
// 使用happypack加速构建
/*new HappyPack({
id: 'babel',
// babel-loader 支持缓存转换出的结果,通过 cacheDirectory 选项开启
loaders: ['babel-loader?cacheDirectory']
})*/
],
module: {
// 设置需要被忽略解析的文件。因为这些文件没有被模块化,解析它们没意义
noParse: [/jquery.js$/, /swiper.js$/, /bootstrap\/js\/\..*js$/],
// 文件匹配规则
rules: [
{
test: /\.js$/,
// include: [path.resolve(__dirname, '../src'), path.resolve(__dirname, '../../componentServer/components')],
// 使用happypack加速构建
exclude: /node_modules|bower_components/,
use: [
{
loader: 'babel-loader?cacheDirectory',
options: {
presets: require(utils.resolveConfig('./babel.config')).presets,
plugins: [
"@babel/plugin-proposal-object-rest-spread",
[
"@babel/plugin-transform-runtime",
{
"corejs": 2
}
]
],
customize: path.resolve(__dirname, './custom-babel-loader'),
}
}
]
},
{
test: /\.pug$/,
include: [utils.resolve('./src'), utils.resolve('./.tmp')],
use: [
{
loader: 'html-loader',
options: {
attrs: [
':data-src',
':data-href',
':data-pc',
':data-mb',
':srcset',
'img:src',
'link:href'
],
minimize: {
collapseWhitespace: false
}
}
},
{
loader: 'pug-to-html-loader',
query: {
data: {
name: '[name]',
staticPath,
commonStaticPath,
staticAssets,
commonStaticAssets,
...wbConfig.private.sitePath,
extend: wbConfig.extend
},
pretty: true
}
}
]
},
{
test: /\.ico$/,
use: [{
loader: 'file-loader',
options: {
name: 'assets/images/[name]'
}
}]
},
{
test: /\.(zip|rar|7z|pdf|doc|docx|ppt|pptx|xls|xlsx|txt)$/,
use: [{
loader: 'file-loader',
options: {
name: 'assets/doc/[name].[hash:7].[ext]'
}
}]
},
{
test: /\.(ogv|webm|mp4|flv|ogg|mp3)$/,
use: [{
loader: 'file-loader',
options: {
name: 'assets/media/[name].[hash:7].[ext]'
}
}]
},
{
test: /\.(jpg|jpeg|png|gif|svg|cur)$/,
exclude: [utils.resolve('./src/fonts')],
use: [
{
loader: 'file-loader',
options: {
name: 'assets/images/[name].[hash:7].[ext]'
}
}
]
},
{
test: /\.(eot|svg|ttf|woff|woff2)$/,
exclude: [utils.resolve('./src/images')],
use: [{
loader: 'file-loader',
options: {
name: 'assets/fonts/[name].[ext]'
}
}]
}
]
}
}
}