【问题标题】:How to bundle JS and CSS file independently with Webpack?如何使用 Webpack 独立捆绑 JS 和 CSS 文件?
【发布时间】:2019-03-05 05:22:30
【问题描述】:

我有一些 JS 和 SCSS 文件。我需要 Webpack 4 将每个 JS 条目捆绑到一个 JS 文件,并将每个 SCSS 条目捆绑到一个 CSS 文件。 JS 文件不导入 SCSS 文件。我尝试使用以下webpack.config.js

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  entry: {
    scriptFoo: './src/js/scriptFoo.js',
    scriptBar: './src/js/scriptBar.js',
    // ...
    styleBaz: './src/css/styleBaz.scss',
    styleBaq: './src/css/styleBaq.scss'
    // ...
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: 'babel-loader'
      },
      {
        test: /\.(scss|sass)$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
          'postcss-loader',
          'sass-loader'
        ]
      }
    ]
  },
  output: {
    filename: '[name].js',
    path: path.resolve(__dirname, 'dist')
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].css'
    })
  ]
};

工作正常,Webpack 将编译好的文件放到dist 目录下。但它也会为dist 目录中的每个 SCSS 文件创建一个多余的虚拟 JS 文件:

webpack.config.js
src/
  js/
    scriptFoo.js
    scriptBar.js
    ...
  css/
    styleBaz.scss
    styleBaq.scss
    ...
dist/
  scriptFoo.js
  scriptBar.js
  ...
  styleBaz.css
  styleBaz.js // Excess
  styleBaq.css
  styleBaq.js // Excess
  ...

如何让Webpack不创建多余的JS文件?

【问题讨论】:

  • 理论上每个 css 都应该包含在它被使用的地方,或者如果它在你的入口点中是全局的。当 css 是入口点时 Webpack 创建虚拟 js 是一个已知错误,尚未修复。这取决于他们。

标签: javascript webpack webpack-4


【解决方案1】:

这是因为对于入口对象中的每个属性,都会在输出目标中创建 js 文件。

output: { filename: '[name].js', path: path.resolve(__dirname, 'dist') },

当 css 为入口点时 Webpack 创建 dummy js 是一个已知错误,尚未修复。

在入口配置中还有多个入口文件也会影响treeshaking能力

【讨论】:

  • 谢谢。您解释了创建虚拟文件的原因,但没有回答问题(如何不创建它们)。
【解决方案2】:

使用ignore-emit-webpack-plugin Webpack 插件不要创建多余的文件。首先通过在控制台中运行来安装它:

npm install --save-dev ignore-emit-webpack-plugin

然后将其添加到您的 Webpack 配置中:

const IgnoreEmitPlugin = require('ignore-emit-webpack-plugin');

module.exports = {
  // ...
  plugins: [
    // ...
    new IgnoreEmitPlugin(['styleBaz.js', 'styleBaq.js']) // Or simply: new IgnoreEmitPlugin(/^style.*\.js$/)
  ]
};

【讨论】:

  • 这是一个荒谬的问题和解决方案。不是你的错,而是它的方式...... Webpack 多年来一直存在这个问题。
  • @ChrisHawkes,Webpack 有其解释一切的逻辑(即使它不直观)。一般来说,Webpack 将输入的 JavaScript 文件组合成输出的 JavaScript 文件,这就是为什么总是发出 JS;它可以通过加载器(将非 JS 文件转换为 JS 的组件)和插件(执行不同的操作,例如将 CSS 提取到单独的输出文件或删除输出文件)进行扩展。实际上,将单个条目的 SCSS 转换为 CSS 并不是 Webpack 的设计目的,但由于我的项目的其余部分是使用 Webpack 构建的,因此我决定也使用 Webpack。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2018-04-02
  • 2017-09-08
  • 1970-01-01
  • 2020-05-18
  • 2019-08-23
相关资源
最近更新 更多