Web 前端开发 我爱编程让前端飞

webpack 学习笔记

2018-05-11  本文已影响0人  _月光临海

本文主要分为:

  • 环境配置
  • 使用配置文件
  • CSS 处理
  • ES6 代码编辑
  • 文件压缩
  • SASS 处理
  • CSS 与 JS 分离
  • 文件处理 file-loader 与 url-loader
  • 多入口及自动清理

客位看官可直接 ctrl + f 搜索对应关键字

环境配置

也可以直接使用 npm init 来初始化 package.json 文件,但这样需要手动填写项目名之类的东西,加上 -y 表示使用默认配置

npm init -y

这里是安装指定版本号的 webpack,不加版本号则是最新版

安装完成

安装完成后的 package.json

package.json

安装完成后的项目目录


新增了 node_modules 目录

如果没有 dist 目录则自动新建

打包
<!DOCTYPE html>
<html>
<head>
    <title>webpack-3.10.0</title>
</head>
<body>
    <h1>Hello World!</h1>
    <script type="text/javascript" src="dist/bundle.js"></script>
</body>
</html>
打包并引入成功 image.png
这样我们在命令行中直接调用 npm run start 也能实现打包的效果 package.json
以第二种方式为例:
监听成功
此时则监听成功,修改 main.js 保存则实时会在 bundle.js 中显示,页面中刷新即可展示;ctrl + c 终止监听。 实时监听
使用配置文件
#  webpack.config.js

var webpack = require("webpack");

module.exports = {
    entry:'./src/main.js', 
    output:{
        path:'./dist',        
        filename:'bundle.js'
    }
}

此时你的项目结构应该是这样的,dist 目录下 空空如也

dist 目录下为空
CSS 处理

loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。
本质上,webpack loader 将所有类型的文件,转换为应用程序的依赖图(和最终的 bundle)可以直接引用的模块。

安装成功
# webpack.config.js

var webpack = require("webpack");
var path = require("path");

module.exports = {
    entry:'./src/main.js',
    output:{
        path:path.resolve(__dirname,'./dist'),
        filename:'bundle.js'
    },
    module:{
        rules:[{
            test:/\.css$/,  //  正则匹配 .css 后缀
            use:'css-loader'
        }]
    }
}

再跑一下

修改配置文件之后
看一下是否被打包到 bundle.js
bundle.js
可以看到 main.css 的样式的确被打包到 bundle.js 中了,但为什么浏览器中没有效果?
npm install style-loader --save-dev
样式已注入
将 ES6 代码编辑为所有浏览器通用的代码

Babel 的作用就是将下一代的 JavaScript 语法转换为现今浏览器兼容的语句

创建 .babelrc
文件压缩
plugins:[
  new webpack.BannerPlugin('顶部注释插件'),
  new webpack.optimize.UglifyJsPlugin()
]

重新打包后的 bundle.js

压缩后的 bundle.js 切换线上环境并打包

这样在命令行中通过 npm run development 即可切换为开发环境(代码不压缩),npm run production 就是生产环境(代码压缩)

开发生产环境切换
var webpack = require("webpack");
var path = require("path");
var isProduction = process.env.NODE_ENV === 'production'

module.exports = {
    entry:'./src/main.js',
    output:{
        path:path.resolve(__dirname,'./dist'),
        filename:'bundle.js'
    },
    module:{
        rules:[{
            test:/\.css$/,
            use:['style-loader','css-loader']
        },{ 
            test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" 
        }]
    },
    plugins:[
        new webpack.BannerPlugin('顶部注释插件'),
    ]
}

if(isProduction){
    module.exports.plugins.push(new webpack.optimize.UglifyJsPlugin())
}

SASS 处理

重新打包,OK


sass 打包
CSS 与 JS 分离
var webpack = require("webpack");
var ExtractTextPlugin = require("extract-text-webpack-plugin"); //  引入插件
var path = require("path");
var isProduction = process.env.NODE_ENV === 'production';


module.exports = {
    entry:'./src/main.js',
    output:{
        path:path.resolve(__dirname,'./dist'),
        filename:'[name].js'
    },
    module:{
        rules:[{
            test: /\.scss$/,
            use: ExtractTextPlugin.extract({        //  使用插件
                fallback: "style-loader",           //  用哪个 loader 加载
                use: [{
                    loader:"css-loader",
                    options:{
                        minimize:isProduction       //  是否压缩 css
                    }},
                    "sass-loader"]                  //  将资源转换为 css
            })
        },{ 
            test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" 
        }]
    },
    plugins:[
        new webpack.BannerPlugin('顶部注释插件'),
        new ExtractTextPlugin("[name].css"),        //  输出为 style.css 文件
    ]
}

if(isProduction){
    module.exports.plugins.push(new webpack.optimize.UglifyJsPlugin())
}

文件处理 file-loader 与 url-loader
原有名字和后缀
多入口及自动清理

这样生成的 jscss 文件将变成 app.jsapp.css

多个入口
  const path = require('path');
  const HtmlWebpackPlugin = require('html-webpack-plugin');
+ const CleanWebpackPlugin = require('clean-webpack-plugin');

  module.exports = {
    entry: {
      app: './src/index.js',
      print: './src/print.js'
    },
    plugins: [
+     new CleanWebpackPlugin(['dist']),
      new HtmlWebpackPlugin({
        title: 'Output Management'
      })
    ],
    output: {
      filename: '[name].bundle.js',
      path: path.resolve(__dirname, 'dist')
    }
  };
上一篇 下一篇

猜你喜欢

热点阅读