资讯专栏INFORMATION COLUMN

使用webpack打包多页jquery项目

GitChat / 2716人阅读

摘要:虽然已经年了不过有一些项目还是需要用到的不过考虑到使用的一堆兼容性问题也为了可以顺利地使用来撸代码研究使用打包代码来发布几个重点为了将模块分割加载,不至于一个文件过大,一个页面中使用多个文件由于是多页项目多个,每个页面使用的文件都不一致基于

虽然已经2019年了
不过有一些项目
还是需要用到jquery的
不过考虑到使用jquery的一堆兼容性问题
也为了可以顺利地使用ES6来撸代码
研究使用webpack+babel打包代码来发布

几个重点:
1.为了将模块分割加载,不至于一个js文件过大,一个页面中使用多个js文件
2.由于是多页项目(多个html),每个页面使用的js文件都不一致
基于以上两点,需要配置多个入口文件
3.会把小图片转换成base64,所以可能css转成的js文件会比较大,所以css文件都多带带设置入口js

例如,我们有三个页面:index、share、assist
三个页面有通用的css文件:common.css
设置入口文件时,可以这样设置

entry: {
    // 通用css
    commoncss: path.resolve(__dirname, "./src/css/common.css.js"),

    // 主页
    indexcss: path.resolve(__dirname, "./src/css/index.css.js"),
    index: path.resolve(__dirname, "./src/index.js"),

    // 页1
    sharecss: path.resolve(__dirname, "./src/css/share.css.js"),
    share: path.resolve(__dirname, "./src/share.js"),

    // 页2
    assistcss: path.resolve(__dirname, "./src/css/assist.css.js"),
    assist: path.resolve(__dirname, "./src/assist.js"),

}

其中,common.css.js文件中,只有几行代码

import "../css/base.css";
import "../css/plugin.css";
import "../css/common.css";

common.css.js文件结束
由于会有一些图片的base64,所以大小大约100+KB

类似的还有index.css.js和share.css.js和assist.css.js
index.css.js如下

import "../css/index.css";

对,就一句话
打包出来的js文件大小就看引入了多少小图片了,一般几百KB

然后,要使用三个webpack的插件

const HtmlWebpackPlugin = require("html-webpack-plugin");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const jquery = require("jquery");

HtmlWebpackPlugin 用于打包出多个html文件
CopyWebpackPlugin 用于img标签,后面说
jquery 就是jquery,全局引用

webpack.config.js里的plugins配置如下

plugins: [
    new webpack.ProvidePlugin({
        $:"jquery"
    }),
    new CopyWebpackPlugin([{
        from: __dirname + "/src/public/"
    }]), // 吧src下public文件夹下的所有内容直接拷贝到dist(输出目录)下
    new HtmlWebpackPlugin({
        filename: "index.htm",
        template: "src/index.html",
        chunks: ["commoncss", "indexcss", "index"],
        inject: "true",
        hash: true,
    }),
    new HtmlWebpackPlugin({
        filename: "share.htm",
        template: "src/share.html",
        chunks: ["commoncss", "sharecss", "share"],
        inject: "true",
        hash: true,
    }),
    new HtmlWebpackPlugin({
        filename: "assist.htm",
        template: "src/assist.html",
        chunks: ["commoncss", "assistcss", "assist"],
        inject: "true",
        hash: true,
    })
]

src目录下的文件如下

index.js assist.js share.js是三个文件分别的入口文件
index.html assist.html share.html是三个文件的模板,html代码可以写在这里
(当然想用模板文件也是可以的,只要HtmlWebpackPlugin插件支持)

dist文件夹如下


(为什么是htm而不是html,是为了便于读者区分模板文件和输出文件)

我们知道,webpack打包不会打包HtmlWebpackPlugin的template里的img标签下的图片,所以在html里使用了img标签的图片都要放在public文件夹下,CopyWebpackPlugin这个组件会直接把图片复制过去

关于HtmlWebpackPlugin的具体参数的细则可以上网搜一下,很多这方面的内容
其他的比如loader、babel不在这篇文章想说的重点之列,不赘述

最后,附上webpack.config.js文件

    let actName = "yourProjectName";// 
    let actKV = {
        name: actName,
        entry: {
            // 通用css
            commoncss: path.resolve(__dirname, "./src/css/common.css.js"),

            // 主页
            indexcss: path.resolve(__dirname, "./src/css/index.css.js"),
            index: path.resolve(__dirname, "./src/index.js"),

            // 分享页1
            sharecss: path.resolve(__dirname, "./src/css/share.css.js"),
            share: path.resolve(__dirname, "./src/share.js"),

            // 分享页2
            assistcss: path.resolve(__dirname, "./src/css/assist.css.js"),
            assist: path.resolve(__dirname, "./src/assist.js"),

        }
    };
    

    return {
        entry: actKV.entry,
        target: "web",
        output: {
            path: path.resolve(__dirname + "/dist/"+actName),
            // publicPath: ".",
            filename: "js/[name].js",
            // chunkFilename: "[name].chunk.[hash].js",
        },
        plugins: [
            new webpack.ProvidePlugin({
                $:"jquery"
            }),
            new CopyWebpackPlugin([{
                from: __dirname + "/src/public/"
            }]),
            new HtmlWebpackPlugin({
                filename: "index.htm",
                template: "src/index.html",
                chunks: ["commoncss", "indexcss", "index"],
                inject: "true",
                hash: true,
            }),
            new HtmlWebpackPlugin({
                filename: "share.htm",
                template: "src/share.html",
                chunks: ["commoncss", "sharecss", "share"],
                inject: "true",
                hash: true,
            }),
            new HtmlWebpackPlugin({
                filename: "assist.htm",
                template: "src/assist.html",
                chunks: ["commoncss", "assistcss", "assist"],
                inject: "true",
                hash: true,
            })
        ],
        mode: "development",
        node: {
            __filename: true,
            __dirname: true
        },
        devtool: isProduction ? "source-map":"inline-source-map",
        devServer:{
            inline: true,
            open: true, 
            historyApiFallback: true, 
            // host: ip.address(),
            host: "localhost",
            progress: true,
            contentBase: "./dist/",
            port: 3430,
            historyApiFallback:true,
            publicPath:"/src/",
            proxy: {
                "*": {
                    target: "http://127.0.0.1:3430",
                    secure: false
                }
            },
        },
        resolve: {
            alias: {
            },
            extensions: [".js", ".less", ".css", ".vue", ".jsx"],
        },
        externals: {
        },
        module: {
            rules: [{
                test: /.vue$/,
                loader: "vue-loader",
            }, {
                test: /.js$/,
                include: path.join(__dirname,"/src"),
                exclude: path.resolve(__dirname, "node_modules"),
                use:[
                    {
                        loader: "babel-loader",
                        query: {
                            presets: ["es2015"]
                        }
                    }
                ]
            }, {
                test: /.xml$/,
                loader: "xml-loader"
            }, {
                test: /.(css|less)$/,
                loader: "style-loader!css-loader",
            }, 
            {
                test: /.(png|jpg|jpeg|gif|icon|webp)$/,
                loader: "url-loader",
                options: {
                    limit: 16384,
                    name: "images/[name].[hash:5].[ext]",
                }
            },
            {
                test: /.(woff|woff2|svg|eot|ttf)??.*$/,
                loader: "file-loader?&name=assets/fonts/[name].[ext]"
            }, {
                test: /.txt$/,
                loader: "text-loader"
            },{
                test: /.jsx$/,
                exclude: /node_modules/,
                loaders: ["jsx-loader", "babel-loader"]
            }]
        },
        
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/53648.html

相关文章

  • webpack多页应用架构系列(十一):预打包Dll,实现webpack音速编译

    摘要:本文首发于的技术博客实用至上,非经作者同意,请勿转载。原文地址如果您对本系列文章感兴趣,欢迎关注订阅这里前言书承上文多页应用架构系列十如何打造一个自定义的。终于,发现了这一大杀器,打包时间过长的问题得到完美解决。 本文首发于Array_Huang的技术博客——实用至上,非经作者同意,请勿转载。原文地址:https://segmentfault.com/a/119000000710437...

    sixleaves 评论0 收藏0
  • webpack多页应用架构系列(四):老式jQuery插件还不能丢,怎么兼容?

    摘要:本文首发于的技术博客实用至上,非经作者同意,请勿转载。怎么来兼容老式插件呢方法有不少,下面一个一个来看。与上述的方案相反,此方案是先用加载的满足老式插件的需要,再通过将其转换成符合模块化要求的。 本文首发于Array_Huang的技术博客——实用至上,非经作者同意,请勿转载。原文地址:https://segmentfault.com/a/1190000006887523如果您对本系列文...

    Chao 评论0 收藏0
  • webpack多页应用架构系列(十):如何打造一个自定义的bootstrap

    摘要:我个人惯用的是,因此本文以为例来介绍如何打造一个自定义的。引入全局的方法请看我之前的这篇文章多页应用架构系列四老式插件还不能丢,怎么兼容,我的脚手架项目也是使用的这套方案。 本文首发于Array_Huang的技术博客——实用至上,非经作者同意,请勿转载。原文地址:https://segmentfault.com/a/1190000007043716如果您对本系列文章感兴趣,欢迎关注订阅...

    jindong 评论0 收藏0
  • 使用webpack打包多页jquery项目

    摘要:虽然已经年了不过有一些项目还是需要用到的不过考虑到使用的一堆兼容性问题也为了可以顺利地使用来撸代码研究使用打包代码来发布几个重点为了将模块分割加载,不至于一个文件过大,一个页面中使用多个文件由于是多页项目多个,每个页面使用的文件都不一致基于 虽然已经2019年了不过有一些项目还是需要用到jquery的不过考虑到使用jquery的一堆兼容性问题也为了可以顺利地使用ES6来撸代码研究使用w...

    darkerXi 评论0 收藏0
  • 使用webpack打包多页jquery项目

    摘要:虽然已经年了不过有一些项目还是需要用到的不过考虑到使用的一堆兼容性问题也为了可以顺利地使用来撸代码研究使用打包代码来发布几个重点为了将模块分割加载,不至于一个文件过大,一个页面中使用多个文件由于是多页项目多个,每个页面使用的文件都不一致基于 虽然已经2019年了不过有一些项目还是需要用到jquery的不过考虑到使用jquery的一堆兼容性问题也为了可以顺利地使用ES6来撸代码研究使用w...

    wuyangnju 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<