【问题标题】:Best way to have all files in a directory be entry points in webpack?让目录中的所有文件成为 webpack 入口点的最佳方法?
【发布时间】:2016-01-20 18:44:47
【问题描述】:

我想为一个网站创建多个入口点,这很容易在 Webpack 中使用 entry 属性的对象来完成,例如 here

但随着网站的增长(不可避免地会),必须添加每个入口点似乎很麻烦并且容易出错。所以我想简单地指向一个目录并说“这里是所有入口点。”

所以我做了这个:

var path = require('path');
var fs = require('fs');
var entryDir = path.resolve(__dirname, '../source/js');
var entries = fs.readdirSync(entryDir);
var entryMap = {};
entries.forEach(function(entry){
    var stat = fs.statSync(entryDir + '/' + entry);
    if (stat && !stat.isDirectory()) {
        var name = entry.substr(0, entry.length -1);
        entryMap[name] = entryDir + '/' + entry;
    }
});

module.exports = {
  entry: entryMap,
  output: {
    path: path.resolve(__dirname, '../static/js'),
    filename: "[name]"
  },
...

这很好用,但是 Webpack 中是否有可以为我处理这个问题的功能或配置选项?

【问题讨论】:

标签: javascript webpack


【解决方案1】:

我认为 glob 是正确的方法(AFAIK webpack 不会为你这样做)。这就是我最终的结果,它会在一个目录中找到所有文件并创建一个名称与文件匹配的条目:

var glob = require('glob');
var path = require('path');

module.exports = {
  entry: glob.sync('../source/js/**.js').reduce(function(obj, el){
     obj[path.parse(el).name] = el;
     return obj
  },{}),
  output: {
    path: path.resolve(__dirname, '../static/js'),
    filename: "[name]"
  },
...

调整搜索路径以满足您的特定需求。如果您有一个特殊的脚本目录,它将使其成为相对路径搜索的新根目录,则传入 {cwd: someRoot} 作为同步的第二个参数也可能很有用。

【讨论】:

  • 好答案,谢谢!我只需要在输出文件名的“[name]”后面添加“.js”。可能是因为 webpack 的更新版本?
  • 为什么不使用path.basenameel.replace(path.resolve('../source/js'), '') 而不是path.parse(el).name
  • 太好了,谢谢,只有一个正确答案。你救了我的命。
【解决方案2】:

我为此使用了Glob

var path = require('path');
var glob = require('glob');

module.exports = {
  entry: { 'app' : glob.sync('./scripts/**/*.ts*') },
  output: {
    path: path.join(__dirname, '/wwwroot/dist'),
    filename: '[name].bundle.js',
    sourceMapFilename: '[name].map'
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        loader: 'ts-loader',
        exclude: /node_modules/,
      }
    ]
  },
  resolve: {
    extensions: [".ts", ".js"]
  }
};

【讨论】:

  • 此配置将创建一个入口点,其中包括所有必要的文件并输出单个包。问题是为每个 *.js 文件创建一个入口点,以便在输出上有与源文件数量一样多的包
【解决方案3】:

在我看来,只需要一点Node技能,也不必那么复杂。

const webpack = require('webpack');
const path = require('path');
const fs = require('fs');

const fileNames = fs.readdirSync('./src').reduce((acc, v) => ({ ...acc, [v]: `./src/${v}` }), {});

const config = {
  entry: fileNames,
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name]',
  },
};

module.exports = config;

【讨论】:

  • 不需要依赖的好解决方案。缺点是如果指定文件夹中有非*.js文件会产生额外的输出文件,这可以通过额外的过滤来解决。您还必须将文件夹的路径写入两次,这很容易出错,但您可以为此设置一个单独的常量
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 2019-02-08
  • 2011-01-30
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多