目前使用 kbone 創建一個小程序,如果你要添加或者修改頁面路徑,則需要修改 webpack.mp.config.js 配置文件。在 entry 入口里面新增或者修改頁面名字和路徑。
那么既然已經用了webpack 來進行打包,那么怎么才能讓這個入口文件進行自動更新呢?
我們可以獲取 /src/pages 目錄下面頁面的名稱,自動生成入口配置, webpack.mp.config.js 修改如下:
注意 /src/pages 目錄是修改后的目錄,具體請看 初始化kbone(react)並將頁面文件位置修改。如果頁面的目錄沒有改動,那么就直接輪詢 /src 目錄下面的頁面就可以了。
1、引入 /src/config/entry.js 文件
const fileList = require('../config/entry')
2、輪詢獲取到的pages里面的文件
// 小程序頁面配置自動化
let fileListNew = [];
// 輪詢數組,將 index 放到第一位,因為入口配置文件中第一個是在沒有設置編譯模式時默打開的頁面
fileList.forEach(function (item) {
if (item === 'index') {
fileListNew.unshift(item)
} else {
fileListNew.push(item);
}
});
let entry = {}
fileListNew.forEach(function(item) {
entry[item] = path.resolve(__dirname, '../src/pages/' + item + '.js')
})
注:如果頁面的目錄沒有改動,那么需要刪除 pages/
3、將 entry 對象設置為 小程序入口的值
module.exports = {
mode: 'production',
entry: {
...entry, // 小程序頁面入口自動化
// 小程序頁面入口
// index: path.resolve(__dirname, '../src/pages/index.js'),
// log: path.resolve(__dirname, '../src/pages/log.js'),
// typelist: path.resolve(__dirname, '../src/pages/typelist.js'),
// detail: path.resolve(__dirname, '../src/pages/detail.js'),
},
...
}
webpack.mp.config.js 配置文件完整代碼:
const path = require('path')
const webpack = require('webpack')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin')
const MpPlugin = require('mp-webpack-plugin')
const isOptimize = false // 是否壓縮業務代碼,開發者工具可能無法完美支持業務代碼使用到的 es 特性,建議自己做代碼壓縮
const fileList = require('../config/entry')
const pjson = require('../package.json')
// 從package.json 中獲取 arias,把@開頭的處理成當前項目能用的路徑
if (pjson && pjson.alias) {
let alias = pjson.alias;
let a = ''
for (a in alias) {
if (a.indexOf('@') === 0) {
alias[a] = path.join(__dirname, '../src' + alias[a]);
}
}
}
// 小程序頁面配置自動化
let entry = {}
fileList.forEach(function(item) {
entry[item] = path.resolve(__dirname, '../src/pages/' + item + '.js')
})
module.exports = {
mode: 'production',
entry: {
...entry, // 小程序頁面入口自動化
// 小程序頁面入口
// index: path.resolve(__dirname, '../src/pages/index.js'),
// log: path.resolve(__dirname, '../src/pages/log.js'),
// typelist: path.resolve(__dirname, '../src/pages/typelist.js'),
// detail: path.resolve(__dirname, '../src/pages/detail.js'),
},
output: {
path: path.resolve(__dirname, '../build/mp/common'), // 放到小程序代碼目錄中的 common 目錄下
filename: '[name].js', // 必需字段,不能修改
library: 'createApp', // 必需字段,不能修改
libraryExport: 'default', // 必需字段,不能修改
libraryTarget: 'window', // 必需字段,不能修改
},
target: 'web', // 必需字段,不能修改
optimization: {
runtimeChunk: false, // 必需字段,不能修改
splitChunks: { // 代碼分隔配置,不建議修改
chunks: 'all',
minSize: 1000,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 100,
maxInitialRequests: 100,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
},
minimizer: isOptimize ? [
// 壓縮CSS
new OptimizeCSSAssetsPlugin({
assetNameRegExp: /\.(css|wxss)$/g,
cssProcessor: require('cssnano'),
cssProcessorPluginOptions: {
preset: ['default', {
discardComments: {
removeAll: true,
},
minifySelectors: false, // 因為 wxss 編譯器不支持 .some>:first-child 這樣格式的代碼,所以暫時禁掉這個
}],
},
canPrint: false
}),
// 壓縮 js
new TerserPlugin({
test: /\.js(\?.*)?$/i,
parallel: true,
})
] : [],
},
module: {
rules: [
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader'
],
},
{
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'less-loader'
]
},
{
test: /\.scss$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'sass-loader'
]
},
{
test: /\.[t|j]sx?$/,
loader: 'babel-loader',
exclude: /node_modules/,
options: {
plugins : [
["transform-react-jsx"],
["class"],
]
}
},
{
test: /\.(png|jpg|gif|svg)$/,
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]'
}
}
]
},
resolve: {
extensions: ['*', '.js', '.vue', '.json'],
alias: {
...pjson.alias,
// '@images': path.join(__dirname, "../src/assets/images"),
// '@components': path.join(__dirname, '../src/components'),
}
},
plugins: [
new webpack.DefinePlugin({
'process.env.isMiniprogram': process.env.isMiniprogram, // 注入環境變量,用於業務代碼判斷
}),
new MiniCssExtractPlugin({
filename: '[name].wxss',
}),
new MpPlugin(require('./miniprogram.config'))
],
}
