美文网首页
Webpack前端项目打包配置

Webpack前端项目打包配置

作者: Brandon_x | 来源:发表于2018-07-08 12:52 被阅读0次

    前提

    全局环境下安装 nodejs

    使用

    1、安装依赖包

    如果项目没有npm管理,即没有package.json文件

    初始化项目为nodejs项目

    npm init

    • 输入必要信息
    • 生成package.json文件
      安装webpack依赖

    cnpm install webpack --save -dev

    • –save:表示在安装的同时,将依赖包写入package.json中
    • -dev:表示将依赖写在devDependency(开发依赖包)中
      安装Loader,style,css,svg,url,file,font-awesome以及postCss

    cnpm install style-loader css-loader svg-url-loader url-loader file-loader font-awesome-webpack postcss-webpack --save -dev

    • style-loader :处理位于页面内的style标签中的css
    • css-loader :处理css文件中的url(这种写法是为了将css与js分开打包,利用插件ExtractTextPlugin)
     {
             test: /\.css$/,
             loader: ExtractTextPlugin.extract({
                   fallback: "style-loader",
                   use: "css-loader"
             })
    },
    
    • svg-url-loader :svg图片处理
     {
                    test: /\.(svg|eot|woff|ttf)\w*/,
                    loader: 'file-loader?outputPath=fonts/&name=[name].[ext]'
    },
    
    • url-loader :
      1.文件大小小于limit参数,url-loader将会把文件转为DataURL;
      2.文件大小大于limit,url-loader会调用file-loader进行处理,参数也会直接传给file-loader。有参数
    {
                    test: /\.(png|jpg|gif)$/,
                    loader: 'url-loader?limit=8192&name=css/images/[name].[ext]'
    },
    
    • file-loader :解析项目中的url引入(不仅限于css),根据我们的配置,将图片拷贝到相应的路径,再根据我们的配置,修改打包后文件引用路径,使之指向正确的文件。有参数
    {
                    test: /\.xsl$/,
                    loader: "file-loader?name=[name].[ext]"
    }
    
    • url-loader和file-loader涉及到了4个参数:limit、name、outputPath、publicPath。
    • 其中limit已经说明过,告诉url-loader,在文件小于多少个字节时,将文件编码并返回DataURL。
    • file-loader相关的是name、outputPath和publicPath。下面解释一下这3个参数
    • name表示输出的文件名规则,如果不添加这个参数,输出的就是默认值:文件哈希。
    • 加上[path]表示输出文件的相对路径与当前文件相对路径相同,加上[name].[ext]则表示输出文件的名字和扩展名与当前相同。
    • 加上[path]这个参数后,打包后文件中引用文件的路径也会加上这个相对路径。
    • outputPath表示输出文件路径前缀。
    • 图片经过url-loader打包都会打包到指定的输出文件夹下。
    • 但是我们可以指定图片在输出文件夹下的路径。
    • 比如outputPath=img/,图片被打包时,就会在输出文件夹下新建(如果没有)一个名为img的文件夹,把图片放到里
    • publicPath表示打包文件中引用文件的路径前缀
    • 如果你的图片存放在CDN上,那么你上线时可以加上这个参数,值为CDN地址,这样就可以让项目上线后的资源引用路径指向CDN了。
    • font-awesome-webpack :处理字体文件
    • postcss-webpack
    • extract-text-webpack-plugin :将css与js分开打包
    • clean-webpack-plugin :在打包前清空目标文件夹
    • copy-webpack-plugin :直接复制文件或文件夹到目标目录

    如果项目已经被npm管理,即包含package.json文件
    直接安装所有依赖

    cnpm install

    2、配置文件 webpack.config.js

    • 首先新建入口文件 index.js

    引入各种需要的js和css等文件

    require('./js/lib/jquery/jquery.js');
    require('./js/lib/jquery/jquery-1.9.1.min.js');
    require('./js/lib/jquery/jquery.colorbox.js');
    
    require('./js/common/common.js');
    require('./js/main.js');
    require('./js/carousel.js');
    // require('./js/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML');
    
    require('./css/iconfont.css');
    require('./css/colorbox.css');
    require('./css/by.css');
    require('./css/jo-dhh.css');
    
    require('./xslt/jats2html.xsl');
    
    • 引入webpack包

    var webpack = require("webpack");

    • 设置打包入口,和输出路径、文件名称

    __dirname为当前目录

    entry: {
            index: __dirname + "/index.js",
            // vendor:['jQuery'],
        },
        output: {
            path: __dirname + "/dist",
            //打包后的文件存放的地方
            filename: "bundle.js"
        },
    
    • 为了将js与css分开打包,需要引入插件extract-text-webpack-plugin

    var ExtractTextPlugin = require("extract-text-webpack-plugin");

    在module中的loader参数中,对css的处理部分修改为

    {
                    test: /\.css$/,
                    loader: ExtractTextPlugin.extract({
                        fallback: "style-loader",
                        use: "css-loader"
                    })
    },
    

    在plugins中添加css文件打包后的输出路径和文件名

    new ExtractTextPlugin("style.css")

    说明:这里如果不将参数格式显示设置为fallback,use格式,后面在打包时会报css文件错误

    • 对图片进行处理

    图片有三种处理方式,一种图片是在css中被设置为背景样式,这里可以直接识别并放入目标文件夹;

    {
                    test: /\.(png|jpg|gif)$/,
                    loader: 'file-loader?name=images/[name].[ext]'
    },
    

    另一种是在html中通过img标签的src引入,因为webpack对html支持不友好,所以需要借助插件html-webpack-plugin

    第三种是借用拷贝插件,直接强行拷贝所有图片,因为本项目图片是在xslt中引用,所以采用第三种和第一种结合的方式处理图片,在plugin参数中添加

    new CopyWebpackPlugin([
                {
                    from: 'css/images',
                    to: 'images'
                },
                {
                    from: 'xmlsample',
                    to: 'xmlsample'
                },
                {
                    from: 'js/MathJax',
                    to: 'MathJax'
                }
    
    ]),
    
    • 对字体文件处理

    这里需要注意:字体文件的css样式和其余资源文件的路径对应问题

    如果css是与其余的css一起打包,那么其中对fonts资源的引用路径也会自动发生变化,一定注意,是个大坑!!

    {
                    test: /\.(svg|eot|woff|ttf)\w*/,
                    loader: 'file-loader?outputPath=fonts/&name=[name].[ext]'
                },
    
    • 其余格式文件处理,项目主要是利用xslt对xml进行转换,所以需要将xslt也进行处理
    {
                    test: /\.xsl$/,
                    loader: "file-loader?name=[name].[ext]"
    }
    
    • 因为涉及到多个文件打包成一个文件,所以开启source-map映射,方便调试,发布版本可以关闭该功能

    devtool: 'source-map',

    • 拷贝其余文件

    var CopyWebpackPlugin = require("copy-webpack-plugin");

    new CopyWebpackPlugin([
                {
                    from: 'css/images',
                    to: 'images'
                },
                {
                    from: 'xmlsample',
                    to: 'xmlsample'
                },
                {
                    from: 'js/MathJax',
                    to: 'MathJax'
                }
    
            ]),
    
    • 因为每次打包结果可能都不一样,所以每次打包之前需要手动删除dist文件夹,不太方便,在网上找到一款可以自动删除目标文件夹的插件

    懒惰才是最大生产力哈哈哈

    var CleanWebpackPlugin = require("clean-webpack-plugin");

    new CleanWebpackPlugin(
                ['dist'],
                {
                    root: __dirname,                 //根目录
                    verbose: true,                  //开启在控制台输出信息
                    dry: false                  //启用删除文件
                })
    
    • 配置文件代码
    var webpack = require("webpack");
    var ExtractTextPlugin = require("extract-text-webpack-plugin");
    var CopyWebpackPlugin = require("copy-webpack-plugin");
    var CleanWebpackPlugin = require("clean-webpack-plugin");
    
    module.exports = {
        entry: {
            index: __dirname + "/index.js",
            // vendor:['jQuery'],
        },
        output: {
            path: __dirname + "/dist",
            //打包后的文件存放的地方
            filename: "bundle.js"
        },
        module: {
            loaders: [
                {
                    test: /\.css$/,
                    loader: ExtractTextPlugin.extract({
                        fallback: "style-loader",
                        use: "css-loader"
                    })
                },
                // [hash:8]
                // {
                //     test: /\.(png|jpg|gif)$/,
                //     loader: 'url-loader?limit=8192&name=css/images/[name].[ext]'
                // },
                {
                    test: /\.(png|jpg|gif)$/,
                    loader: 'file-loader?name=images/[name].[ext]'
                },
                {
                    test: /\.(svg|eot|woff|ttf)\w*/,
                    loader: 'file-loader?outputPath=fonts/&name=[name].[ext]'
                },
                {
                    test: /\.xsl$/,
                    loader: "file-loader?name=[name].[ext]"
                }
            ]
        },
        devtool: 'source-map',
        plugins: [
            new ExtractTextPlugin("style.css"),
            // new webpack.optimize.CommonsChunkPlugin({
            //     names: ['vendor', 'manifest'],
            // }),
            new CopyWebpackPlugin([
                {
                    from: 'css/images',
                    to: 'images'
                },
                {
                    from: 'xmlsample',
                    to: 'xmlsample'
                },
                {
                    from: 'js/MathJax',
                    to: 'MathJax'
                }
    
            ]),
            new CleanWebpackPlugin(
                ['dist'],
                {
                    root: __dirname,                 //根目录
                    verbose: true,                  //开启在控制台输出信息
                    dry: false                  //启用删除文件
                })
        ]
    }
    

    相关文章

      网友评论

          本文标题:Webpack前端项目打包配置

          本文链接:https://www.haomeiwen.com/subject/ackouftx.html