javascript - Webpack 4 配置入口点和输出(每个项目文件夹中生成的 dist 文件夹)

标签 javascript node.js configuration webpack-4 webpack.config.js

案例是有主文件夹 'Projects' 并在那里安装所有带有配置的 webpack 4 文件。 “项目”文件夹内有许多文件夹,如 “Project1”、“Project2”等...我想从 “node_modules” 入口点开始,其中 webpack.config.js 是并在那里自定义进一步的入口点,如 ./Project1/js/app.jsx,输出如 ./Project1/dist/js/main.js ,同scss和index.html,都是在'dist'文件夹下生成的。问题是总是只在主 'Projects' 文件夹中安装一次 node_modules。


package.json:

{
  "name": "webpack4_example",
  "version": "1.0.0",
  "main": "index.js",
  "browserslist": ["last 2 versions"],
  "scripts": {
    "build": "webpack --mode production",
    "watch": "webpack --watch --mode development",
    "start": "webpack-dev-server --open --mode development"
  },
  "devDependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.4",
    "babel-preset-env": "^1.7.0",
    "babel-preset-react": "^6.24.1",
    "babel-preset-stage-2": "^6.24.1",
    "css-loader": "^0.28.11",
    "html-loader": "^0.5.5",
    "html-webpack-plugin": "^3.2.0",
    "mini-css-extract-plugin": "^0.4.0",
    "node-sass": "^4.9.0",
    "postcss-loader": "^2.1.5",
    "prop-types": "^15.6.1",
    "react": "^16.3.2",
    "react-dom": "^16.3.2",
    "sass-loader": "^7.0.1",
    "webpack": "^4.8.3",
    "webpack-cli": "^2.1.3",
    "webpack-dev-server": "^3.1.4"
  }
}

webpack.config.js:

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

module.exports = {
  entry: './Project1/js/app.jsx',                // customized entry point
  output: { 
    path: path.resolve(__dirname, 'dist'),  
    filename: './js/out.js'                     // generated ./Project1/dist/js/out.js
  },
  watch: true,
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader'
        }
      },
      {
        test: /\.html$/,
        use: [
          { 
            loader: 'html-loader',
            options: { minimize: true } 
          }
        ]
      },
      {
        test: /\.(png|jpe?g)/i,
        use: [
          {
            loader: 'url-loader',
            options: {
              name: './img/[name].[ext]',
              limit: 10000
            }
          },
          {
            loader: 'img-loader'
          }
        ]
      },
      {
        test: /\.scss$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
          'postcss-loader',
          'sass-loader'
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: './Project1/index.html',     // not sure how to set these sections
      filename: 'index.html'
    }),
    new MiniCssExtractPlugin({
      filename: '[name].css',
      chunkFilename: '[id].css'
    })
  ]
};

.babelrc:

{
  "presets": ["env", "react", "stage-2"]
}

据我所知,如果没有自定义入口点,webpack 默认会搜索 'Projects/src/...' 以查找所有文件,例如 scss、js、img、index.html、index.js对它们进行操作,并将生成包含所有生成文件的 'Projects/dist' 文件夹。

上面的配置表单编译没有错误,但不会在任何地方生成“dist”文件夹,所以我不确定编译过程是否正确完成。

非常感谢任何建议和解决方案

最佳答案

解决方案(更新:添加工作观看文件): 好的,我已经设法让它工作了(起点是 node_modules 和其他 webpack4 配置文件的安装位置,在 Projects 主文件夹中)

Projects
   |__Project1
   |         |__js
   |         |   |__app.jsx
   |         |__dist       //desirable result, generated dist folder
   |         |     |__*     //all generated folders/files html, js, css, img
   |         |__index.ejs  //renamed from index.html
   |
   |__Project2  //etc, project folders
   |
   |__src // if without customized entry points it's default source
   |    |__folders like /_scss, /img, /js
   |    |__index.js
   |    |__index.ejs   //renamed index.html, used when no customized
   |                   //entry points are set, same as for all /src
   |
   |__node_modules
   |__.babelrc
   |__package.json
   |__webpack.config.js

.babelrc 与上一篇文章相同,没有变化

在这个例子中,在 Projects 文件夹中通常会创建 src 文件夹,其中包含要通过 webpack4 传递的所有文件/文件夹,在 /src/index.js 文件必须存在,它用于导入一些其他文件

index.js 的例子

import style from "./_scss/main.scss";    //paths for Projects/src/...
import style from "./main.css";

package.json

{
  "name": "webpack4_example",
  "version": "1.0.0",
  "main": "index.js",            // the file explained just above
  "browserslist": ["last 2 versions"],
  "scripts": {
    "dev": "webpack --mode development ./Project1/js/app.jsx --output ./Project1/dist/js/main.js",
    "build": "webpack --mode production ./Project1/js/app.jsx --output ./Project1/dist/js/main.js",
    "watch": "webpack --watch --mode development",
    "start": "webpack-dev-server --mode development --open --watch-content-base ./Project1/js/app.jsx"  //watching desired files changes live in browser
  },
  "devDependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.4",
    "babel-preset-env": "^1.7.0",
    "babel-preset-react": "^6.24.1",
    "babel-preset-stage-2": "^6.24.1",
    "css-loader": "^0.28.11",
    "html-loader": "^0.5.5",
    "html-webpack-plugin": "^3.2.0",
    "mini-css-extract-plugin": "^0.4.0",
    "node-sass": "^4.9.0",
    "postcss-loader": "^2.1.5",
    "prop-types": "^15.6.1",
    "react": "^16.3.2",
    "react-dom": "^16.3.2",
    "sass-loader": "^7.0.1",
    "webpack": "^4.8.3",
    "webpack-cli": "^2.1.3",
    "webpack-dev-server": "^3.1.4"
  }
}

where --mode production |发展 | none 表示对 dist 文件夹中的输出文件进行格式优化或不进行此类优化,为了便于阅读,请使用 none

webpack.config.js

const HtmlWebPackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  module: {
    rules: [
      {
        test: /\.(js$|jsx$)/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader'
        }
      },
      {
        test: /\.html$/,
        use: [
          { 
            loader: 'html-loader',
            options: { minimize: true } 
          }
        ]
      },
      {
        test: /\.(png|jpe?g)/i,
        use: [
          {
            loader: 'url-loader',
            options: {
              name: './img/[name].[ext]',
              limit: 10000
            }
          },
          {
            loader: 'img-loader'
          }
        ]
      },
      {
        test: /\.(css$|scss$)/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
          'postcss-loader',
          'sass-loader'
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: './Project1/index.ejs',     // entry point for html
      filename: 'index.html'
    }),
    new MiniCssExtractPlugin({
      filename: '[name].css',
      chunkFilename: '[id].css'
    })
  ],
  watchOptions: {                   //added to make possible watch files
    ignored: /node_modules/,
    aggregateTimeout: 300,
    poll: 1000
  }
};

index.html 的自定义入口点,其中 .html 扩展名更改为 .ejs,以解决 之间引起的一些问题code>html-loaderhtml-webpack-plugin。使用 .ejs 时,输出的 html,也自动放置在 dist 文件夹中,没有优化格式并且是可读的。注意 html.ejs 是否包含带有 [out].js 文件固定路径的标记(这里是在 dist 文件夹中生成的)。从 dist 文件夹生成的 index.html 将添加另一个这样的行,因此它会加倍 -> 要删除的行。

用于运行:npm run buildnpm start

关于javascript - Webpack 4 配置入口点和输出(每个项目文件夹中生成的 dist 文件夹),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50443835/

相关文章:

node.js - 从 axios 获取对象数组并使用返回值调用另一个 axios 函数并将输出附加到第一个结果

oracle - 为 Oracle 用户设置默认值 "alter session"

c# - 如何读取 appSettings.json 中的字符串数组?

javascript - 为什么 $scope 和 'this' 关键字在 Controller 内可以互换使用?

javascript - 循环显示帮助命令

node.js - Mongodb重复键错误。如何从错误对象中获取错误字段作为对象?

macos - 在 Mac OSX 10.6.7 上安装 Node 时出现问题

c++ - 配置文件的实现

javascript - 编辑标签 explorer.js

javascript - 如何跟踪事件发送了多少次?