博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webpack动态创建入口
阅读量:5963 次
发布时间:2019-06-19

本文共 4266 字,大约阅读时间需要 14 分钟。

转载自

背景

create-react-app创建的应用默认是SPA的架子入口只有index.html。但是有些情况下我们确实需要在同一个工程下开发多个SPA项目,一个是2C的H5项目,一个是后台的管理项目。网上多页面的配置已经很多了,这里只是想扩展记录一些方法。

实践

项目的架子是下面这样的。

按照网上大多数的配置如下。

// 入口文件的配置  entry: {    anchorH5: [      require.resolve('./polyfills'),      require.resolve('react-dev-utils/webpackHotDevClient'),      paths.appSrc + "/views/anchorH5/index.js",    ],    anchorWeb: [      require.resolve('./polyfills'),      require.resolve('react-dev-utils/webpackHotDevClient'),      paths.appSrc + "/views/anchorWeb/index.js",    ],    orderManageH5: [      require.resolve('./polyfills'),      require.resolve('react-dev-utils/webpackHotDevClient'),      paths.appSrc + "/views/orderManageH5/index.js",    ]  }  // 插件文件新增  new HtmlWebpackPlugin({    inject: true,    chunks: ["anchorH5"],    template: paths.appHtml,    filename: 'anchorH5.html',    favicon: paths.appPublicFavicon,    minify: {      removeComments: true,      collapseWhitespace: true,      removeRedundantAttributes: true,      useShortDoctype: true,      removeEmptyAttributes: true,      removeStyleLinkTypeAttributes: true,      keepClosingSlash: true,      minifyJS: true,      minifyCSS: true,      minifyURLs: true,    },  })  new HtmlWebpackPlugin({    inject: true,    chunks: ["anchorWeb"],    template: paths.appHtml,    filename: 'anchorWeb.html',    favicon: paths.appPublicFavicon,    minify: {      removeComments: true,      collapseWhitespace: true,      removeRedundantAttributes: true,      useShortDoctype: true,      removeEmptyAttributes: true,      removeStyleLinkTypeAttributes: true,      keepClosingSlash: true,      minifyJS: true,      minifyCSS: true,      minifyURLs: true,    },  })  new HtmlWebpackPlugin({    inject: true,    chunks: ["orderManageH5"],    template: paths.appHtml,    filename: 'orderManageH5.html',    favicon: paths.appPublicFavicon,    minify: {      removeComments: true,      collapseWhitespace: true,      removeRedundantAttributes: true,      useShortDoctype: true,      removeEmptyAttributes: true,      removeStyleLinkTypeAttributes: true,      keepClosingSlash: true,      minifyJS: true,      minifyCSS: true,      minifyURLs: true,    },  })复制代码

大量的重复性代码看着就难受,所以我们就需要将这些提取简化成方法。

const glob = require('gob')  function getEntry() {    let entry = {};    let srcDirName = './src/views/*/index.js'; //入口文件夹路径    glob.sync(srcDirName).forEach(function (name) {      let n = name.slice(0, name.length - 9); //去掉/index.js      n = n.slice(n.lastIndexOf('/')).split("/")[1]; //获取文件夹目录名      entry[n] = [          require.resolve('./polyfills'),          require.resolve('react-dev-utils/webpackHotDevClient'),          paths.appSrc + "/views/"+ n +"/index.js",      ];    });    return entry;  }  function getPlugins() {    let = [...otherPlugin]    let srcDirName = './src/views/*/index.js';     glob.sync(srcDirName).forEach(function (name) {      let n = name.slice(0, name.length - 9);       n = n.slice(n.lastIndexOf('/')).split("/")[1];      plugins.push(new HtmlWebpackPlugin({          inject: true,          chunks: [n],          template: paths.appHtml,          filename: n + '.html',          favicon: paths.appPublicFavicon,          minify: {              removeComments: true,              collapseWhitespace: true,              removeRedundantAttributes: true,              useShortDoctype: true,              removeEmptyAttributes: true,              removeStyleLinkTypeAttributes: true,              keepClosingSlash: true,              minifyJS: true,              minifyCSS: true,              minifyURLs: true,          },      }))    });  }  module.export = {    entry: getEntry(),    ...    plugins: getPlugins(),  }复制代码

这样后面维护的人只需要按照这个规则建新的目录就好了,而不用每次都去修改webpack的配置了。 但是这样本地启动服务的时候还有点问题,因为我们还没有修改webpackDevServer的配置。

// 指明哪些路径映射到哪个html  function getRewrites (){    let list = []    let srcDirName = './src/views/*/index.js';     glob.sync(srcDirName).forEach(function (name) {        var n = name.slice(0, name.length - 9);        n = n.slice(n.lastIndexOf('/')).split("/")[1];        list.push({            from: eval("/^\\/" + n + "/"), to: config.output.publicPath + n +'.html'        });    });    return list;  }  // 修改webpackDevServer配置  historyApiFallback: {    disableDotRule: true,    rewrites: getRewrites()  }复制代码

这样就OK了?。

你可能感兴趣的文章
uva 1363---数论思维题
查看>>
sql serve基础
查看>>
mongodb地理位置索引
查看>>
CKEditor
查看>>
如何使用 volatile, synchronized, final 进行线程间通信
查看>>
(原创)基于内容的图像检索系统(集成语义特征)
查看>>
问题009:java当中的关键字有哪些?在Editplus文本编辑软件中是什么颜色的?java当中的标识符有什么要求?Java中注释分为几类?...
查看>>
TreeMap 底层是红黑树 排序是根据key值进行的 添加元素时异常 Comparable异常 Comparator比较自定义对象放在键的位置...
查看>>
Linux内核剖析(二)Linux内核绪论
查看>>
win32.gui.api.con(前置,鼠标点击,发送数据的Dome)
查看>>
KMP算法
查看>>
Neural Network学习(二)Universal approximator :前向神经网络
查看>>
回文自动机(BZOJ2565)
查看>>
数组排序和字符串
查看>>
IE10,11下_doPostBack未定义错误的解决方法
查看>>
响应式web设计之CSS3 Media Queries
查看>>
值类型与引用类型精解
查看>>
python接口自动化——初级
查看>>
Mojo C++ Bindings API
查看>>
How to unfollow masively users on Instagram using a little trick with JavaScript in the Browser
查看>>