前提

全局环境下安装 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                  //启用删除文件
            })
    ]
}