如何使用webpack在项目中设置多个文件的输入和输出?


76

如何使用webpack在项目中设置多个文件的输入/输出?

如果在一个条目/输出中只有一个文件,我将遵循http://webpack.github.io/docs/tutorials/getting-started/成功进行编译...

目录

app
webpack.config.js
./assets
././javascripts/Administrator/Article/Create/Base.js
././javascripts/Administrator/Article/Edit/Base.js
././javascripts/Account/Index/Base.js
././javascripts/Contact/Index/Base.js
...

怎么这样输出?

././javascripts/Administrator/Article/Create/bundle.js
././javascripts/Administrator/Article/Edit/bundle.js
././javascripts/Account/Index/bundle.js
././javascripts/Contact/Index/bundle.js

webpack.config.js

module.exports = {
  entry: {
    'AdministratorArticleCreate':['./assets/javascripts/Administrator/Article/Create/Base.js']
  },
  output: {
    path: 
  }

    // if only one file
    // entry: "./assets/javascripts/Administrator/Article/Create/Base.js",
    // output: {
    //     // path: __dirname,
    //     path: "./assets/javascripts/Administrator/Article/Create/",
    //     filename: "bundle.js"
    // }
};

1
我也遇到了这个问题,找不到任何解决方案。如果有人可以分享解决方案,那就太好了
Kania 2015年

Answers:


72

对于许多入口点,请使用数组作为entry属性的值:

entry: {
  app: ['./app/main.js', '.lib/index.js'],
  vendors: ['react']
}

app并且vendors是数组,因此您可以根据需要放置任意数量的文件路径。

对于输出情况:

output: {
  path: staticPath,
  filename: '[name].js'
}

[name]摘自entry特性,所以如果我们有appvendors作为属性,我们得到了2个输出文件-app.jsvendors.js

文档链接


5
您要具有不同的文件扩展名,例如,输出app.jsstyles.css
Borek Bernard

1
可以有不同的输出文件夹吗?
泰勒·朗

2
我该怎么做entry: ./app/js/*.js?逐个放置文件名太麻烦了。
威廉·肯尼迪

这对编译时意味着什么。'main.js'可以从index.js请求模块吗?
pery mimon

不起作用!输入:{app:settings.themeLocation +“ js / vote-scripts.js”},输出:{path:path.resolve(__ dirname,settings.themeLocation +“ js”),文件名:“ [name] .js”}
Tintinabulator Zea '18

57

如果要输出到多个目录,可以将路径用作条目名称。例如,如果您需要此目录结构:

apps
├── dir1
│   └── js
│       ├── main.js [entry 1]
│       └── bundle.js [output 1]
└── dir2
    ├── index.js [entry 2]
    └── foo.js [output 2]

然后在您的module.exports中尝试一下:

{
  entry: {
    'dir1/js/bundle': path.resolve(__dirname, '/apps/dir1/js/main.js'),
    'dir2/foo' : path.resolve(__dirname, '/apps/dir2/index.js')
  },
  output: {
    path: path.resolve(__dirname, '/apps'),
    filename: '[name].js'
  },
  ...
}

10
辉煌–将路径元素放入入口点的“名称”中……
HDave

2
感谢您实际提供其工作方式的直观图表。
马丁·道森

2
有用的,除了重复的目录名称外
JacopKane '17

有点hacking,并且(可能)是非正式的,但是很好。一个非常好的。
ecc521

28

真正为我解决的是:

entry:  {
    app : __dirname + "/app/views/app/app.js",
    admin : __dirname + "/app/views/admin/admin.js"
}

output: {
    path: __dirname + "/public",
    filename: "[name].js"
},

3
我唯一要注意的是,它使用密钥替换“ [name]”,因此密钥中不能包含无效字符(例如local-admin将无效),但这是次要的。
Sirius_B

7

您可以使用全局同步模式检测多个条目并生成单独的输出文件。

将此放入您的webpack.config.js(没有...

const glob = require("glob");
...
module.exports = (env, options) => ({
  ...
  entry: glob.sync("./javascripts/**/*.js").reduce((acc, item) => {
    const path = item.split("/");
    path.pop();
    const name = path.join('/');
    acc[name] = item;
    return acc;
  }, {}),
  output: {
    filename: "[name]/bundle.js",
    path: path.resolve(__dirname, "")
  },
  ...
});

这“应该”为您提供所需的输出。


6

如果你想获得输出文件,foo.cssbar.js在同一时间?上面的答案似乎无法解决这个问题。

理智的方法是使用多编译器。一个输入文件一个配置对象一个输出文件。从这个答案


3

这个webpack插件web-webpack-plugin可以通过示例方式解决它。

AutoWebPlugin可以在目录中找到所有页面条目,然后WebPlugin为每个页面自动配置以输出html文件,您可以按以下方式使用它:

webpack配置

module.exports = {
    plugins: [
        new AutoWebPlugin(
            // the directory hold all pages
            './src/', 
            {
            // the template file path used by all pages
            template: './src/template.html',
            // javascript main file for current page,if it is null will use index.js in current page directory as main file
            entity: null,
            // extract common chunk for all pages and then put it into a file named common,if it is null then not do extract action
            // achieve by CommonsChunkPlugin
            commonsChunk: 'common',
            // pre append to all page's entry
            preEntrys:['./path/to/file1.js'],
            // post append to all page's entry
            postEntrys:['./path/to/file2.js'],
        }),
    ]
};

src目录

── src
│   ├── home
│   │   └── index.js
│   ├── ie_polyfill.js
│   ├── login
│   │   └── index.js
│   ├── polyfill.js
│   ├── signup
│   │   └── index.js
│   └── template.html

输出目录

├── dist
│   ├── common.js
│   ├── home.html
│   ├── home.js
│   ├── ie_polyfill.js
│   ├── login.html
│   ├── login.js
│   ├── polyfill.js
│   ├── signup.html
│   └── signup.js

AutoWebPlugin在中找到所有页面home login signup目录./src/,因为这三个页面home login signup将用index.js作主文件,并输出三个html文件home.html login.html signup.html`

参见doc:自动检测html条目



1

对于我的用例,我实际上需要根据环境使用不同的模板。为此,我传入了NODE_ENV变量

module.exports = (env, argv) => {
  const ENVIRONMENT = env.NODE_ENV;
  let INDEX_HTML = 'index.html';
  if (ENVIRONMENT === 'staging') {
    INDEX_HTML = 'index-stg.html';
  }

然后:

if (NODE_ENV === 'staging') {
   INDEX_HTML = 'index-stg.html';
}

在输出中:

output: {
      path: process.cwd() + '/build',
      filename: `[name].js`,
      chunkFilename: `[${HASH_MODE}].[name].js`
    },

插件:

new HtmlWebpackPlugin({
        inject: true,
        template: `app/${INDEX_HTML}`,
      }),
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.