如何使用webpack打包多页面并且使 css,js,img在各自页面的目录文件夹下?

本文分享了一种自定义的HTML、CSS、JavaScript和图片资源的打包策略,通过webpack配置实现文件的按需加载和优化,包括使用ExtractTextPlugin分离CSS、HtmlWebpackPlugin生成HTML文件等。

遇到HTML CSS JS IMG 需要单独打包的情况了,虽然现在很多都是自动化打包了,但有些时候还是偏向于定制,就是根据自己的需求去编写,打包的方法以及配置和输出的路径。对打包过程进行干预

基于上次的单文件打包。做一下升级

最终打包出来的文件是这样的?

1545354-20190718101748026-1626699813.png

运行结果我就不放了,

打包的config如下

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
// const Uglifyjs = require('uglifyjs-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const {CleanWebpackPlugin} = require("clean-webpack-plugin")
module.exports = {
    entry:{
        ap:'./src/js/page_ap.js',
        sat:'./src/js/page_sat.js',
        sat2:'./src/js/sat2.js'
    },
    output:{
        path:path.resolve(__dirname,'dist'),
        filename:'[name]/js/index.js?[hash]'
    },
    mode:'development',
    module:{
        rules:[
            {
                test: /\.html$/,
                loader: 'html-withimg-loader'
            },
            {
                test:/\.jsx?/,
                include:[
                    path.resolve(__dirname,'src')
                ],
                use:'babel-loader'          
            },
            {
                test:/\.css$/,
                include:[
                    path.resolve(__dirname,'src')
                ],
                use:ExtractTextPlugin.extract({
                    fallback:'style-loader',
                    use:'css-loader'
                })
            },
            {
                test: /\.(png|jpg|gif)$/,
                use: [
                  {
                      loader:'url-loader',
                      options:{
                          limit:10240,
                          outputPath:'./asset/img',
                          name:'[name].[hash].[ext]',
                        //   PublicPath:''
                      }
                  }
                ]
            }
        ]
    },
    plugins:[
        new CleanWebpackPlugin(),
        new ExtractTextPlugin('[name]/css/[name].css'),
        new HtmlWebpackPlugin({
                title:'ap',
                filename:'/ap/index.html',
                template:'src/ap/index.html',
                chunks:['ap']
        }),
        new HtmlWebpackPlugin({
            title:'sat',
            filename:'sat/index.html',
            template:'src/sat/index.html',
            chunks:['sat']
        }),
        new HtmlWebpackPlugin({
            title:'sat2',
            filename:'sat2/index.html',
            template:'src/sat2/index.html',
            chunks:['sat2']
        }),
        // new Uglifyjs()
    ]
}

最后贴一张目录结构吧,其实真实项目比这个复杂多了,可能很乱

1545354-20190718102240062-2078536888.png

可以看得出来还是有一些问题的,不够智能,不能自动需找所有路径,因为项目路径比较乱,自己研究的还不够透彻,如果能帮到你,或者你能帮我,欢迎留言。

转载于:https://www.cnblogs.com/heson/p/11139317.html

<think> 我们需要在webpack配置中处理图片资源,并指定输出路径。 在Vue2.0项目中,通常使用vue-cli创建,内置了webpack配置。如果要自定义,我们可以在项目根目录下创建或修改`vue.config.js`文件(如果没有的话)。 在webpack中,处理图片通常使用`url-loader`或`file-loader`(vue-cli默认使用url-loader,当图片大小小于指定阈值时转为base64,否则使用file-loader)。 需求:指定一个包含图片的文件夹打包到common的img文件夹下。 假设我们的源图片文件夹是`src/assets/images`,我们希望打包后输出到`dist/common/img`目录下。 我们可以在`vue.config.js`中通过`chainWebpack`或`configureWebpack`来修改webpack配置。 这里以`configureWebpack`为例,使用对象形式来合并配置。 注意:Vue CLI 内部已经配置了图片的loader,我们需要修改的是输出路径(publicPath)和输出文件名(name)。 在webpack配置中,图片处理的loader通常在module.rules中,我们可以覆盖原有的图片处理规则,或者修改其选项。 但是,Vue CLI 使用了`chainWebpack`,因此我们可以使用链式操作来修改loader的选项。 具体步骤: 1. 在`vue.config.js`文件中,使用`chainWebpack`方法。 2. 找到处理图片的规则,然后修改options。 默认情况下,Vue CLI 将小于4KB的图片转换为base64,大于4KB的图片会使用file-loader,并将输出到`img`目录下(文件名是[hash:8].[ext])。 现在我们要将图片输出到`common/img`目录下,可以通过修改`file-loader`的`name`选项。 同时,我们还需要注意publicPath,因为有可能部署在非根路径下。不过,Vue CLI默认会根据publicPath自动设置,所以一般不需要改。 假设我们的目标是将图片输出到`common/img`目录下,那么我们可以设置`name: 'common/img/[name].[hash:8].[ext]'`。 但是,注意:这个修改会影响所有的图片资源。如果我们只想将特定文件夹(例如`src/assets/images`)下的图片打包到`common/img`下,而其他图片(比如node_modules中的图片)保持原样,那么我们需要添加额外的规则。 然而,Vue CLI默认的图片规则已经处理了项目中的图片(即src目录下的图片)。所以我们只需要修改默认规则即可。 但是,默认规则不仅处理图片,还处理svg(通过不同的loader),所以我们需要分别修改。 实际上,Vue CLI 将图片和svg分开处理。我们主要关注图片(png、jpe?g、gif、webp等)。 我们可以这样修改: ```js module.exports = { chainWebpack: config => { // 修改处理图片的规则 config.module .rule('images') .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/) .use('url-loader') .loader('url-loader') .tap(options => { // 修改options options = { ...options, // 保留其他选项 // 设置输出路径,[name]是原文件名,[hash:8]是8位哈希,[ext]是后缀 name: 'common/img/[name].[hash:8].[ext]' } return options; }) } } ``` 但是,注意:Vue CLI 默认的图片规则中,name选项是通过一个函数返回的,而不是一个字符串。所以我们不能直接这样覆盖。 查看Vue CLI默认配置,我们可以通过`config.module.rule('images').uses.get('url-loader').get('options')`来查看默认选项。 实际上,Vue CLI 默认的图片规则中,name选项是一个函数,返回字符串。所以我们也可以覆盖为一个字符串吗?可以,但是注意默认的publicPath处理。 另一种更简单的方法是,我们直接设置generator选项(webpack5的方式),但Vue2项目可能是webpack4,所以我们使用name。 在webpack4中,我们可以这样设置: ```js .tap(options => { options.name = 'common/img/[name].[hash:8].[ext]'; return options; }) ``` 但是,这会导致所有的图片都被输出到`common/img`下,包括可能来自node_modules的图片(一般来说,项目中的图片都是src下的,而node_modules里的图片不会被这个规则处理,因为默认规则排除了node_modules)。 所以,这样设置是安全的。 另外,我们还需要注意,这个规则也会处理css中的图片,所以都会输出到`common/img`。 但是,如果我们的需求是只将某个特定文件夹的图片输出到common/img,而其他图片保持原位置(比如assets下的其他图片),那么我们就需要添加一条新的规则来处理这个特定文件夹,并禁用默认规则对这个文件夹的处理(或者使用include和exclude)。 不过,根据问题描述,我们只需要指定一个包含图片的文件夹。假设这个文件夹是`src/assets/images`,我们可以这样: 1. 添加一条新的规则,仅针对`src/assets/images`目录下的图片,并指定输出路径。 2. 修改默认的images规则,排除`src/assets/images`目录,这样默认规则就不会处理这个文件夹了。 步骤: 1. 修改默认的images规则,排除images目录 ```js config.module.rule('images') .exclude.add(path.resolve(__dirname, 'src/assets/images')) ``` 2. 添加新的规则,命名为'custom-images'(名字可以自取),仅处理src/assets/images目录 ```js config.module .rule('custom-images') .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/) .include .add(path.resolve(__dirname, 'src/assets/images')) .end() .use('url-loader') .loader('url-loader') .options({ limit: 4096, // 和默认一样,4KB name: 'common/img/[name].[hash:8].[ext]' }) ``` 这样,只有`src/assets/images`下的图片会使用这个规则,输出到`common/img`,而其他图片还是使用默认规则,输出到`img`目录(默认位置)。 因此,根据需求,我们有两种方案。下面我们分别给出。 方案一:修改所有图片的输出路径(全部输出到common/img): ```js // vue.config.js module.exports = { chainWebpack: config => { // 修改images规则 config.module .rule('images') .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/) .use('url-loader') .loader('url-loader') .tap(options => { // 修改name选项 options.name = 'common/img/[name].[hash:8].[ext]'; return options; }) } } ``` 方案二:仅将特定文件夹(例如src/assets/images)下的图片输出到common/img,其他图片保持默认(输出到img): ```js const path = require('path'); module.exports = { chainWebpack: config => { // 1. 排除特定目录,让默认规则不处理这个目录 config.module.rule('images') .exclude .add(path.resolve(__dirname, 'src/assets/images')); // 2. 添加新规则处理特定目录 config.module .rule('custom-images') .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/) .include .add(path.resolve(__dirname, 'src/assets/images')) .end() .use('url-loader') .loader('url-loader') .options({ limit: 4096, // 4KB,和默认一致 name: 'common/img/[name].[hash:8].[ext]' }); } } ``` 注意:在方案二中,我们添加了一个新规则,并且这个规则只处理`src/assets/images`目录下的图片。同时,我们修改了默认的images规则,使其排除该目录,避免重复处理。 根据你的需求选择方案。 最后,记得在`vue.config.js`中,我们使用了`path.resolve(__dirname, ...)`来获取绝对路径。 另外,如果你使用的是webpack5(Vue CLI默认是webpack4,但如果升级了),那么可能需要使用`type: 'asset'`来代替url-loader和file-loader。不过Vue2项目默认是webpack4。 因此,我们按照webpack4的方式配置。 示例:使用方案一(修改所有图片输出路径)的完整配置: ```js // vue.config.js module.exports = { chainWebpack: config => { config.module .rule('images') .use('url-loader') .tap(options => { options.name = 'common/img/[name].[hash:8].[ext]'; return options; }) } } ``` 这样,所有图片都会被打包到`dist/common/img`目录下。 但是,请注意:如果项目中有多个地方使用图片,那么所有的图片都会进入这个目录。如果只想针对特定文件夹使用方案二。 另外,如果你使用的是Vue CLI 3以上,默认的publicPath是'/',所以生成的图片路径会是`/common/img/xxx`。如果部署在非根路径,需要设置publicPath,例如: ```js module.exports = { publicPath: process.env.NODE_ENV === 'production' ? '/your-base-url/' : '/', // ... 其他配置 } ``` 这样,图片路径就会是`/your-base-url/common/img/xxx`。 最后,注意:在开发模式下,图片可能不会实际输出到dist目录,而是由webpack-dev-server处理。只有生产模式打包才会输出到dist目录。 验证:运行`npm run build`,查看dist目录下是否有common/img文件夹并且里面包含处理的图片。 如果使用方案二,则只有`src/assets/images`下的图片会进入common/img,其他图片进入默认的img目录。 相关问题: </think> 在 Vue 2.0 使用 Webpack 打包的项目中,需要将特定图片文件夹打包到 `common/img` 目录下,可以通过修改 `vue.config.js` 中的 Webpack 配置实现。以下是详细解决方案: ### 解决方案代码 ```javascript // vue.config.js const path = require('path'); module.exports = { chainWebpack: config => { // 添加新的图片处理规则(优先级高于默认规则) config.module .rule('custom-images') .test(/\.(png|jpe?g|gif|webp|svg)(\?.*)?$/) .include .add(path.resolve(__dirname, 'src/assets/special-images')) // 指定你的图片源文件夹 .end() .use('url-loader') .loader('url-loader') .tap(options => { // 修改输出路径和文件名 return { ...options, name: 'common/img/[name].[hash:8].[ext]', // 输出到 common/img 目录 esModule: false // 确保与 Vue 2 兼容 }; }); } }; ``` ### 代码解释 1. **规则名称**: - 创建新规则 `custom-images` 避免覆盖默认规则 2. **路径配置**: - `path.resolve(__dirname, 'src/assets/special-images')`:替换为你的实际图片源文件夹路径 3. **文件匹配**: - `test` 正则匹配常见图片格式(png/jpg/jpeg/gif/webp/svg) 4. **输出配置**: - `name: 'common/img/[name].[hash:8].[ext]'`: - `common/img/`:指定输出目录 - `[name]`:保留原始文件名 - `[hash:8]`:添加 8 位哈希值防止缓存问题 - `[ext]`:保留原始文件扩展名 5. **兼容性设置**: - `esModule: false`:确保与 Vue 2 的模板解析兼容 ### 目录结构示例 ``` 项目根目录/ ├── src/ │ └── assets/ │ └── special-images/ <-- 你的源图片文件夹 │ ├── logo.png │ └── banner.jpg ├── dist/ <-- 打包输出目录 │ └── common/ │ └── img/ <-- 目标输出目录 │ ├── logo.d4f8a2c3.png │ └── banner.e9c1d45a.jpg └── vue.config.js <-- 配置文件 ``` ### 注意事项 1. **哈希值的作用**: - 添加文件内容哈希,确保浏览器缓存更新 - 同名文件修改后会自动生成新哈希值 2. **默认规则处理**: - 此配置只会影响指定文件夹下的图片 - 其他位置的图片仍按默认规则处理 3. **路径引用**: - 在 Vue 组件中使用时保持原始引用路径: ```html <img src="@/assets/special-images/logo.png"> ``` - 打包后会自动转换为正确路径 4. **开发模式**: - 开发模式下图片使用 base64 内联(默认 4KB 以下文件) - 可通过 `limit` 选项调整内联阈值
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值