1. 项目初始化

项目初始化

必备条件: 已经安装了新的node

(来看看官网的解释 :在开始之前,请确保安装了 Node.js 的最新版本。使用 Node.js 最新的长期支持版本(LTS - Long Term Support),是理想的起步。使用旧版本,你可能遇到各种问题,因为它们可能缺少 webpack 功能以及/或者缺少相关 package 包。)

1. 初始化项目

1). 如果是第一次运行:

npm init

在该目录下通过git输入npm init。如果该目录是中文名称,则会报错。解决办法发:修改文件夹命名。

2). 如果是从别人那里拿来的package.json,第二次运行:

npm install

如果我们是从别人那里拿来的package.json,那么在初始化的时候需要 npm install 一下,下载配置文件的所有插件

2. 安装webpack 和webpack命令行工具webpack-cli

npm install webpack webpack-cli --save-dev

这是同时安装webpack和webpack-cli。webpack4之后把webpack-cli从webpack中分离出来,需要单独安装webpack-cli。–save-dev 是下载开发版的意思。可以简写成 -D

3. 执行webpack

$ webpack

(报错)webpack4 之后 需要添加默认入口 即文件夹src 并且src中要有个index.js文件 于是我们在该文件夹下面创建文件夹src。 src中创建了index.js文件

  • 如果提示没有设置mode环境: the mode option has not been set 那就设置开发环境
    webpack --mode=development
    

4. 配置webpack.config.js

简单写法一:

module.exports = {
    entry:"./src/main.js",
    output:{
        filename:"bundle.js",
        path:__dirname+"out"
    },
    mode:"development"
}

简单写法二:

var path = require("path")
module.exports = {
    entry:"./src/main.js",
    output:{
        filename:"bundle.js",
       // path:__dirname+"/out",
        path:path.resolve(__dirname,"out")
    },
    mode:"development"
}

5.开启webpack服务器

如果我们不想使用wempserver,那就可以webpack的服务器

安装方式:

npm install webpack-dev-server -g

-D是–save-dev的缩写

使用方式:

var path = require("path")
module.exports = {
    entry:"./src/main.js",
    output:{
        filename:"bundle.js",
       // path:__dirname+"/out",
        path:path.resolve(__dirname,"out")
    },
    mode:"development",
    
    devServer:{
        contentBase:"out",
        port:9999
    }
}

devServer:{

contentBase:"out", // 设置默认打开localhost:8080时候显示的窗口

port:9999 // 自定义端口 }

webpack安装与使用

四核心:

  • 入口(entry)编辑文件
  • 出口(output)打包后
  • loader(解析器)加载css文件
  • 插件(plugins)拓展的功能 比如抽离css文件

webpack应用

第一种情况,在js里面通过require("index.html")方式引入html文件的

demo

var path = require("path")
module.exports = {
    entry:"./src/main.js", // 入口文件很重要 打包的是从入口文件开始 把入口文件引用的文件都打包到一起
/**
 * 入口文件也可以这样写
 * entry:[
 *      index:"./src/index.js",
 *      other:"./src/other/js"
 * ]
 */
   
    output:{
// 如果入口文件写成了 上面那种鬼样子 ,不希望出口文件全部打包成一个文件的话 可以这样写
//  filename:'[name].js' 或是 '[name].out.js' 其中name对应入口文件的属性 即如上的index、other
        filename:"bundle.js",
       // path:__dirname+"/out",
        path:path.resolve(__dirname,"out")
    },
    mode:"development",

    // 自定义服务器
    devServer:{
        contentBase:"out", // 自定义服务器页面
        port: 9999, // 自定义服务器端口
    },
    module:{

        // 解析器 只解析入口的文件
        rules:[
            {
                // css解析器
                test:/\.css$/,
                use:['style-loader','css-loader'] 
            },
            {
                // js es6解析器
                test:/\.js$/,
                use:['babel-loader']
            },
            {
                // 静态资源解析器
                test:/\.(jpg|png|gif)$/,
              //  use:['url-loader'] // 新版本后 url-loader包含了file-loader功能
              //  use:['url-loader']是一种写法 另一种写法是 
                use:[
                    {
                        loader:'url-loader',
                        options:{
                            limit:8192, // 1024 * 8 = 8192
                            name:"img/[name].ext" 
                            // 如果图片超过8k 那就保存成原来的样子 
                        }
                    }
                ]

            },
            {
                test:/\.html/,
                use:[
                    // 对单独抽离出来的html文件进行配置
                    {
                        loader:"file-loader",
                        options:{
                            name:"index.html"
                            // 这里还可以这样写 
                            // name:"[name].html"
                            // 表示沿用原来的名字命名
                        }
                    },
                    // 单独抽离 html
                    {
                        loader:"extract-loader"
                    },

                    // 找到html文件
                    {
                        loader:"html-loader"
                    }
                ]
            }

        ]
    }
}

第二种情况,单独分离出来的样式

demo:

// 利用一个插件将html导出
var HtmlWebpackPlugins = require('html-webpack-plugins')

// 压缩css 引入插件包
var Minify = require('minify-css-extract-plugins')

// 压缩js 引入插件包
var Uglify = require('uglifyjs-webpack-plugins')



var path = require("path")
module.exports = {

    // 应用插件
    plugins:[
        // 通过这个插件专门解析html文件 而不是像上面那样子 通过require引用html
        // 在使用这个插件之前 需要先安装html-webpack-plugins插件 
        // $ npm install html-webpack-plugins -D 
        new HtmlWebpackPlugins({
            // 自定义html里面的标题内容
            title:'title',

            // 根据下面这个html生成一个index.html
            // 要注意的是 如果通过插件的方式这样写 相当于用下面这个文件的内容 替换成输出文件夹里面的对应文件的内容
            // 生成的文件存在路径问题 因此需要在配置的时候要到下面url-loader下面改一下导出路径
            template:'./src/index.html',

            minify:{
                // 是否压缩空白
                collpaseWhitespace:true
            }
        }),

        // js插件 你没有看错 就这样一行就搞定了
        new Uglify(),


        // 通过这个文件专门解析css文件 使用前需要安装 mini-css-extract-plugins 

        new Minify ({
            // 使用这个的话 需要在css加载器里面将 style-loader 加载器改成 Minify.loader
            // 单独抽离出来的文件
            filename:'[name]_[contenthash:8].css'
        })


    ],

    entry:"./src/main.js", // 入口文件很重要 打包的是从入口文件开始 把入口文件引用的文件都打包到一起
/**
 * 入口文件也可以这样写
 * entry:[
 *      index:"./src/index.js",
 *      other:"./src/other/js"
 * ]
 */
   
    output:{
// 如果入口文件写成了 上面那种鬼样子 ,不希望出口文件全部打包成一个文件的话 可以这样写
//  filename:'[name].js' 或是 '[name].out.js' 其中name对应入口文件的属性 即如上的index、other
        filename:"bundle.js",
       // path:__dirname+"/out",
        path:path.resolve(__dirname,"out")
    },
    mode:"development",

    // 自定义服务器
    devServer:{
        contentBase:"out", // 自定义服务器页面
        port: 9999, // 自定义服务器端口
    },
    module:{

        // 解析器 只解析入口的文件
        rules:[
            {
                // css解析器
                test:/\.css$/,
                use:[Minify.loader,'css-loader'] 
            },
            {
                // js es6解析器
                test:/\.js$/,
                use:['babel-loader']
            },
            {
                // 静态资源解析器
                test:/\.(jpg|png|gif)$/,
              //  use:['url-loader'] // 新版本后 url-loader包含了file-loader功能
              //  use:['url-loader']是一种写法 另一种写法是 
                use:[
                    {
                        loader:'url-loader',
                        options:{
                            limit:8192, // 1024 * 8 = 8192
                            // name:"img/[name].[ext]" 
                            name:'[name].[ext],'
                            // 如果图片超过8k 那就保存成原来的样子 
                        }
                    }
                ]

            },
            // {
            //     test:/\.html/,
            //     use:[
            //         // 对单独抽离出来的html文件进行配置
            //         {
            //             loader:"file-loader",
            //             options:{
            //                 name:"index.html"
            //             }
            //         },
            //         // 单独抽离 html
            //         {
            //             loader:"extract-loader"
            //         },

            //         // 找到html文件
            //         {
            //             loader:"html-loader"
            //         }
            //     ]
            // }

        ]
    }
}