kbone小程序页面入口自动生成
目前使用 kbone 创建一个小程序,如果你要添加或者修改页面路径,则需要修改 webpack.mp.config.js 配置文件。在 entry 入口里面新增或者修改页面名字和路径。
那么既然已经用了webpack 来进行打包,那么怎么才能让这个入口文件进行自动更新呢?
我们可以获取 /src/pages 目录下面页面的名称,自动生成入口配置, webpack.mp.config.js 修改如下:
注意 /src/pages 目录是修改后的目录,具体请看 。如果页面的目录没有改动,那么就直接轮询 /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')) ], }