乐闻世界logo
搜索文章和话题

Webpack 如何将静态文件复制到构建产物目录?

7 个月前提问
3 个月前修改
浏览次数135

6个答案

1
2
3
4
5
6

在CSS中,display属性非常重要,它决定了一个元素如何在页面上显示和布局。以下是 display属性的一些常用值及其作用:

  1. none:

    • 作用:完全隐藏元素,并且不为该元素保留空间。
    • 例子:当您希望在某些条件下不显示一些元素,比如用JavaScript动态隐藏或显示内容。
  2. block:

    • 作用:使元素表现为块级元素,占据一行的全部宽度,之后的元素会在新的一行显示。
    • 例子:用于布局时,如创建一个自包含的内容区块,例如段落、标题和容器等。
  3. inline:

    • 作用:使元素在行内显示,不会独占一行,元素的宽度仅由内容决定。
    • 例子:用于格式化文本,如 <span><a>元素,让它们在段落中内联显示。
  4. inline-block:

    • 作用:结合了 inlineblock的特点,不会独占一行,但是可以设置宽度和高度。
    • 例子:当你需要在一行中显示多个块,并且控制它们的大小时,如导航菜单的每个项。
  5. flex:

    • 作用:使元素成为一个flex容器,其子元素可以使用flex布局的强大特性。
    • 例子:用于创建一个响应式的布局,其中子元素的大小和顺序可以灵活调整。
  6. grid:

    • 作用:使元素成为一个grid容器,可以定义行和列,创建复杂的二维布局。
    • 例子:用于设计复杂的页面布局,如杂志或报纸式的布局。
  7. tabletable-rowtable-cell等:

    • 作用:这些值模仿了HTML表格标签的行为,允许以表格格式布局页面内容。
    • 例子:当你想用CSS的方式呈现表格数据时,可以选择这些值。
  8. list-item:

    • 作用:使元素表现为列表项,通常与列表标记一起显示。
    • 例子:用于定制列表的外观,如自定义列表项目符号或项目布局。

这些是 display属性中一些常用的值。此外,还有许多其他值和属性组合可以用来实现特定的布局需求。随着Web技术的发展,CSS规范也在不断增加新的显示类型以应对更复杂的设计挑战。继续解释更多的 display 属性的值:

  1. inline-flex:

    • 作用:使元素成为一个行内级的flex容器,这意味着元素可以像 inline元素一样在文本行中布局,同时其内部的子元素可以使用flexbox模型。
    • 例子:如果你想要一个小的布局单元能够在文本行中布局,同时又想在这个小单元内部使用flexbox布局,比如在一个段落中的小卡片。
  2. inline-grid:

    • 作用:使元素成为一个行内级的grid容器,结合了 inlinegrid的特性。
    • 例子:当你需要在文本流中嵌入一个小的网格布局时使用,例如一个复杂的数学公式或图表。
  3. contents:

    • 作用:使元素的子元素看起来像是直接放置在其父元素所在的位置,父元素本身不会被渲染成任何盒模型,但是其子元素会正常显示。
    • 例子:当你需要一个容器仅用于语义组织,而不希望它在布局中创建一个新层级时使用。
  4. run-in:

    • 作用:根据上下文,元素可能表现为 blockinline元素。
    • 例子:这个值比较少见,某些情况下可以用于标题和段落之间的布局。
  5. flex-startflex-endcenterspace-betweenspace-aroundspace-evenly:

    • 作用:这些值多用于flex容器的 align-itemsalign-contentjustify-content等属性,而不是 display属性,用来定义flex项目在主轴或交叉轴上的对齐方式。
    • 例子:当你需要在一个flex容器内对齐或分散排列子项时使用。
  6. grid-auto-columnsgrid-auto-rows:

    • 作用:这些值用于 grid容器上,定义网格中隐式创建的行或列的大小。
    • 例子:当你有一个动态数量的网格项,并且需要自动的行或列大小时。
  7. grid-template-columnsgrid-template-rows:

    • 作用:这些值用于 grid容器上,定义显式创建的行或列的大小和数量。
    • 例子:当你在设计一个明确的网格布局,需要指定每一列或行的大小。
  8. grid-column-startgrid-column-endgrid-row-startgrid-row-end:

    • 作用:这些值用于 grid项上,定义它们在网格中的位置和跨越的列或行数。
    • 例子:当你需要在网格中放置一个元素,占据多列或多行时。

CSS的 display属性是个非常复杂且强大的工具,能够应对各种各样的布局需求。随着CSS规范的不断发展,新的 display值和布局模型如Flexbox和Grid提供了前所未有的灵活性和控制力。

2024年6月29日 12:07 回复

使用文件加载器模块请求资源是 webpack 的使用方式(source)。但是,如果您需要更大的灵活性或想要更清晰的界面,您也可以使用我的copy-webpack-pluginnpmGithub)直接复制静态文件。以你static为例build

shell
const CopyWebpackPlugin = require('copy-webpack-plugin'); module.exports = { context: path.join(__dirname, 'your-app'), plugins: [ new CopyWebpackPlugin({ patterns: [ { from: 'static' } ] }) ] };

_兼容性说明:_如果您使用的是旧版本的 webpack,例如webpack@4.x.x,请使用copy-webpack-plugin@6.x.x. 否则使用最新的。

2024年6月29日 12:07 回复

你不需要复制东西,webpack 的工作方式与 gulp 不同。Webpack 是一个模块捆绑器,您在文件中引用的所有内容都将包含在内。您只需要为此指定一个加载程序。

所以如果你写:

shell
var myImage = require("./static/myImage.jpg");

Webpack 首先尝试将引用的文件解析为 JavaScript(因为这是默认的)。当然,那会失败。这就是为什么您需要为该文件类型指定一个加载器。例如,文件或url -loader获取引用的文件,将其放入 webpack 的输出文件夹(应该build在您的情况下)并返回该文件的哈希 url。

shell
var myImage = require("./static/myImage.jpg"); console.log(myImage); // '/build/12as7f9asfasgasg.jpg'

通常加载器是通过 webpack 配置应用的:

shell
// webpack.config.js module.exports = { ... module: { loaders: [ { test: /\.(jpe?g|gif|png|svg|woff|ttf|wav|mp3)$/, loader: "file" } ] } };

当然,您需要先安装文件加载器才能使其工作。

2024年6月29日 12:07 回复

如果您想复制静态文件,可以通过以下方式使用文件加载器:

对于 html 文件:

在 webpack.config.js 中:

shell
module.exports = { ... module: { loaders: [ { test: /\.(html)$/, loader: "file?name=[path][name].[ext]&context=./app/static" } ] } };

在你的 js 文件中:

shell
require.context("./static/", true, /^\.\/.*\.html/);

./static/ 是相对于你的js文件所在的位置。

您可以对图像或其他内容执行相同的操作。上下文是一种强有力的探索方法!

2024年6月29日 12:07 回复

前面提到的copy-webpack-plugin带来的一个之前没有解释过的优点是,这里提到的所有其他方法仍然将资源捆绑到你的捆绑文件中(并要求你在某个地方“需要”或“导入”它们)。如果我只想移动一些图像或一些模板部分,我不想用对它们的无用引用来弄乱我的 javascript 捆绑文件,我只希望在正确的位置发出文件。我还没有找到任何其他方法可以在 webpack 中执行此操作。诚然,这不是 webpack 最初设计的目的,但它绝对是当前的用例。(@BreakDS 我希望这能回答你的问题 - 如果你想要的话,这只是一个好处)

2024年6月29日 12:07 回复

Webpack 5 添加了资产模块,这些模块本质上是常见文件加载器的替代品。我复制了以下文档的相关部分:

  • asset/resource发出一个单独的文件并导出 URL。以前可以通过使用file-loader.
  • asset/inline导出资产的数据 URI。以前可以通过使用url-loader.
  • asset/source导出资产的源代码。以前可以通过使用raw-loader.
  • asset自动选择导出数据 URI 和发出单独的文件。以前可以通过使用url-loader资产规模限制来实现。

要添加一个,您可以使您的配置如下所示:

shell
// webpack.config.js module.exports = { ... module: { rules: [ { test: /\.(jpe?g|gif|png|svg|woff|ttf|wav|mp3)$/, type: "asset/resource" } ] } };

要控制文件的输出方式,您可以使用模板化路径

在配置中,您可以在此处设置全局模板:

shell
// webpack.config.js module.exports = { ... output: { ... assetModuleFilename: '[path][name].[hash][ext][query]' } }

要覆盖一组特定的资产,您可以执行以下操作:

shell
// webpack.config.js module.exports = { ... module: { rules: [ { test: /\.(jpe?g|gif|png|svg|woff|ttf|wav|mp3)$/, type: "asset/resource" generator: { filename: '[path][name].[hash][ext][query]' } } ] } };

提供的模板将生成类似于build/images/img.151cfcfa1bd74779aadb.png. 哈希对于缓存清除等很有用。您应该根据您的需要进行修改。

2024年6月29日 12:07 回复

你的答案