webpack 什么时候在Angular build中生成index.html?

tyu7yeag  于 2024-01-08  发布在  Webpack
关注(0)|答案(3)|浏览(292)

我试图弄清楚在构建阶段Angular何时生成index.html文件,以便之后可以将其移动到另一个目录。我注意到,当我尝试使用WebpackShellPlugin复制文件时,在onBuildEndonBuildExit阶段,index.html都不在dist/projectToMove目录中。
Webpack配置如下:

  1. const WebpackShellPlugin = require('webpack-shell-plugin');
  2. module.exports = {
  3. plugins: [
  4. new WebpackShellPlugin({
  5. onBuildEnd: [
  6. 'echo "Files at end of compilation: "',
  7. 'ls ./dist/apps/curemedit/'
  8. ],
  9. onBuildExit: [
  10. 'echo "Copying Popup App contents..."',
  11. 'ls ./dist/apps/curemedit/',
  12. 'cp -rvf ./dist/apps/curemedit/* ./dist/apps/'
  13. ],
  14. safe: true
  15. })
  16. ]
  17. };

字符串
两种情况下ls的输出:

  1. favicon.ico
  2. main.js
  3. main.js.map
  4. manifest.json
  5. polyfills.js
  6. polyfills.js.map
  7. runtime.js
  8. runtime.js.map
  9. styles.js
  10. styles.js.map
  11. vendor.js
  12. vendor.js.map


我有一个浏览器扩展的多应用程序Angular工作区。projectToMove是将用于此扩展的弹出显示的工作区。我正在尝试将dist中相应文件夹的内容向上移动一级,以便它与扩展根目录中的manifest文件一起。
我猜测生成index.html文件的延迟是由于ES 5 bundle生成差异加载。我在这个项目的browserslist文件中设置了Chrome >= 61,但事实证明这并没有什么区别。
获取index.html文件的正确方法是什么?我应该用一个节点脚本更长时间地监视文件夹,还是有更优雅的解决方案?

关于我的用例的其他信息:

我正在构建一个浏览器扩展。以前它是一个单一的项目Angular 工作区,live reload使用webpack-extension-reloader作为explained here工作。现在我有两个单独的弹出显示和选项页面的Angular 项目,这两个项目的相应index.html页面都需要扩展根文件夹中的js和css文件。所以现在我有一个丑陋的hack使用CopyPlugin,WebpackShellPlugin和一些悲伤的sed。
以下是添加的构建配置文件:
ext.config.js:

  1. const CopyPlugin = require('copy-webpack-plugin');
  2. const WebpackShellPlugin = require('webpack-shell-plugin');
  3. module.exports = {
  4. entry: {
  5. background: './src/chrome/background.ts'
  6. },
  7. plugins: [
  8. new CopyPlugin([
  9. {
  10. from: './src/chrome/manifest.json',
  11. to: '../manifest.json'
  12. }
  13. ]),
  14. new WebpackShellPlugin({
  15. onBuildExit: [
  16. // Rename sourcemaps, js and css files -> undo chunks' renamings -> move them to extension root
  17. 'echo "Moving Options App Contents..."',
  18. 'for f in ./dist/apps/proj1/*.js.map; do mv "$f" "${f%.js.map}.proj1.js.map"; done ',
  19. 'for f in ./dist/apps/proj1/*.js; do mv "$f" "${f%.js}.proj1.js"; done ',
  20. 'mv ./dist/apps/proj1/styles.css ./dist/apps/proj1/styles.proj1.css',
  21. 'for f in ./dist/apps/proj1/[0-9].proj1.js; do mv "$f" "${f%.proj1.js}.js"; done ',
  22. 'for f in ./dist/apps/proj1/workspace*.proj1.js; do mv "$f" "${f%.proj1.js}.js"; done ',
  23. 'for f in ./dist/apps/proj1/workspace*.proj1.js.map; do mv "$f" "${f%.proj1.js.map}.js.map"; done ',
  24. 'mv -v ./dist/apps/proj1/* ./dist/apps/'
  25. ],
  26. safe: true
  27. })
  28. ]
  29. };


ext.popup.js:

  1. const WebpackShellPlugin = require('webpack-shell-plugin');
  2. module.exports = {
  3. plugins: [
  4. new WebpackShellPlugin({
  5. onBuildExit: [
  6. 'echo "Moving Popup App Contents..."',
  7. 'for f in ./dist/apps/proj2/*.js.map; do mv "$f" "${f%.js.map}.proj2.js.map"; done ',
  8. 'for f in ./dist/apps/proj2/*.js; do mv "$f" "${f%.js}.proj2.js"; done ',
  9. 'mv ./dist/apps/proj2/styles.css ./dist/apps/proj2/styles.proj2.css',
  10. 'mv -v ./dist/apps/proj2/* ./dist/apps/'
  11. ],
  12. safe: true
  13. })
  14. ]
  15. };


sed.sh:

  1. #!/bin/sh
  2. sed -i 's/.js/.proj1.js/g' ./dist/apps/proj1/index.html
  3. sed -i 's/styles.css/styles.proj1.css/g' ./dist/apps/proj1/index.html
  4. sed -i 's/.js/.proj2.js/g' ./dist/apps/proj2/index.html
  5. sed -i 's/styles.css/styles.proj2.css/g' ./dist/apps/proj2/index.html


package.json:

  1. "build": "rm -rf ./dist/ && ng build proj1 && ng build proj2 && ./sed.sh",
  2. "buildprod": "rm -rf ./dist/ && ng build proj1 --prod && ng build proj2 --prod && ./sed.sh"

dddzy1tm

dddzy1tm1#

我不完全理解你的用例,但希望这能有所帮助。
Angular CLI允许配置index属性。默认情况下,这只是一个指定index.html文件在src目录中位置的路径。输出路径将与输入路径相同。但CLI也接受指定输入路径和输出路径的对象。
该属性深度嵌套在angular.json文件中。在新生成的应用程序中,它位于projects> project-name> architect> build > index

  1. "index": {
  2. "input": "src/index.html",
  3. "output": "../index.html"
  4. }

字符串
这将把index.html文件放置在其他文件之上一个级别。不幸的是,这不会改变对index.html文件中其他文件的引用。这仍然需要在外部完成。我认为这是一个bug,因此创建了一个bug report

pengsaosao

pengsaosao2#

为什么不直接将构建输出到正确的文件夹中呢?如果可以将输出放在首选目标中,为什么还要对抗构建呢?
使用@angular/cli,我只需编辑angular.json,使"outputPath"不是"dist/appname",而是适合您的用例的任何内容。
无论如何,我认为index.html是你真的不需要复制的单个文件:它的内容永远不会改变,至少如果你保持文件名一致,没有哈希代码。
为什么不简单地在任何需要的地方保留一个预编译的index.html,并简单地将构建输出放在一个子文件夹中呢?

pdsfdshx

pdsfdshx3#

我所做的就是

  • 将firebase.json目标更新为Index.html所在的正确文件路径。
  • 重新构建,
  • Firebase部署

相关问题