146 lines
3.9 KiB
JavaScript
146 lines
3.9 KiB
JavaScript
var path = require('path')
|
||
var fs = require('fs')
|
||
var utils = require('./utils')
|
||
var config = require('../config')
|
||
var webpack = require('webpack')
|
||
var merge = require('webpack-merge')
|
||
var vueLoaderConfig = require('./vue-loader.conf')
|
||
var MpvuePlugin = require('webpack-mpvue-asset-plugin')
|
||
var glob = require('glob')
|
||
var CopyWebpackPlugin = require('copy-webpack-plugin')
|
||
var relative = require('relative')
|
||
|
||
function resolve(dir) {
|
||
return path.join(__dirname, '..', dir)
|
||
}
|
||
|
||
function getEntry(rootSrc) {
|
||
var map = {};
|
||
glob.sync(rootSrc + '/pages/**/main.js')
|
||
.forEach(file => {
|
||
var key = relative(rootSrc, file).replace('.js', '');
|
||
map[key] = file;
|
||
})
|
||
return map;
|
||
}
|
||
|
||
const appEntry = { app: resolve('./src/main.js') }
|
||
const pagesEntry = getEntry(resolve('./src'), 'pages/**/main.js')
|
||
const entry = Object.assign({}, appEntry, pagesEntry)
|
||
|
||
let baseWebpackConfig = {
|
||
// 如果要自定义生成的 dist 目录里面的文件路径,
|
||
// 可以将 entry 写成 {'toPath': 'fromPath'} 的形式,
|
||
// toPath 为相对于 dist 的路径, 例:index/demo,则生成的文件地址为 dist/index/demo.js
|
||
entry,
|
||
target: require('mpvue-webpack-target'),
|
||
output: {
|
||
path: config.build.assetsRoot,
|
||
jsonpFunction: 'webpackJsonpMpvue',
|
||
filename: '[name].js',
|
||
publicPath: process.env.NODE_ENV === 'production'
|
||
? config.build.assetsPublicPath
|
||
: config.dev.assetsPublicPath
|
||
},
|
||
resolve: {
|
||
extensions: ['.js', '.vue', '.json'],
|
||
alias: {
|
||
'vue': 'mpvue',
|
||
'@': resolve('src')
|
||
},
|
||
symlinks: false,
|
||
aliasFields: ['mpvue', 'weapp', 'browser'],
|
||
mainFields: ['browser', 'module', 'main']
|
||
},
|
||
module: {
|
||
rules: [
|
||
{
|
||
test: /\.vue$/,
|
||
loader: 'mpvue-loader',
|
||
options: vueLoaderConfig
|
||
},
|
||
{
|
||
test: /\.js$/,
|
||
include: [resolve('src'), resolve('test')],
|
||
use: [
|
||
'babel-loader',
|
||
{
|
||
loader: 'mpvue-loader',
|
||
options: Object.assign({ checkMPEntry: true }, vueLoaderConfig)
|
||
},
|
||
]
|
||
},
|
||
{
|
||
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
|
||
loader: 'url-loader',
|
||
options: {
|
||
limit: 10000,
|
||
name: utils.assetsPath('img/[name].[ext]')
|
||
}
|
||
},
|
||
{
|
||
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
|
||
loader: 'url-loader',
|
||
options: {
|
||
limit: 10000,
|
||
name: utils.assetsPath('media/[name].[ext]')
|
||
}
|
||
},
|
||
{
|
||
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
|
||
loader: 'url-loader',
|
||
options: {
|
||
limit: 10000,
|
||
name: utils.assetsPath('fonts/[name].[ext]')
|
||
}
|
||
},
|
||
{
|
||
test: /.less$/, loader: "style-loader!css-loader!less-loader",
|
||
}
|
||
]
|
||
},
|
||
plugins: [
|
||
// api 统一桥协议方案
|
||
new webpack.DefinePlugin({
|
||
'mpvue': 'global.mpvue',
|
||
'mpvuePlatform': 'global.mpvuePlatform'
|
||
}),
|
||
new MpvuePlugin(),
|
||
new CopyWebpackPlugin([{
|
||
from: '**/*.json',
|
||
to: ''
|
||
}], {
|
||
context: 'src/'
|
||
}),
|
||
new CopyWebpackPlugin([
|
||
{
|
||
from: path.resolve(__dirname, '../static'),
|
||
to: path.resolve(config.build.assetsRoot, './static'),
|
||
ignore: ['.*']
|
||
}
|
||
])
|
||
]
|
||
}
|
||
|
||
// 针对百度小程序,由于不支持通过 miniprogramRoot 进行自定义构建完的文件的根路径
|
||
// 所以需要将项目根路径下面的 project.swan.json 拷贝到构建目录
|
||
// 然后百度开发者工具将 dist/swan 作为项目根目录打
|
||
const projectConfigMap = {
|
||
tt: '../project.config.json',
|
||
swan: '../project.swan.json'
|
||
}
|
||
|
||
const PLATFORM = process.env.PLATFORM
|
||
if (/^(swan)|(tt)$/.test(PLATFORM)) {
|
||
baseWebpackConfig = merge(baseWebpackConfig, {
|
||
plugins: [
|
||
new CopyWebpackPlugin([{
|
||
from: path.resolve(__dirname, projectConfigMap[PLATFORM]),
|
||
to: path.resolve(config.build.assetsRoot)
|
||
}])
|
||
]
|
||
})
|
||
}
|
||
|
||
module.exports = baseWebpackConfig
|