sxx的技术专栏 Nodejs and Javascript Coder

webpack快速入门教程

2018-07-29
blockxia

阅读:


webpack快速入门教程

1、了解Webpack相关

* 什么是webpack
    * Webpack是一个模块打包器(bundler)。
    * 在Webpack看来, 前端的所有资源文件(js/json/css/img/less/...)都会作为模块处理
    * 它将根据模块的依赖关系进行静态分析,生成对应的静态资源
* 四个核心概念
    * Entry:入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。
    * Output:output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。
    * Loader:loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只能解析 JavaScript)。
    * Plugins:插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量等。
* 理解Loader
	* Webpack 本身只能加载JS/JSON模块,如果要加载其他类型的文件(模块),就需要使用对应的loader 进行转换/加载
    * Loader 本身也是运行在 node.js 环境中的 JavaScript 模块
    * 它本身是一个函数,接受源文件作为参数,返回转换的结果
    * loader 一般以 xxx-loader 的方式命名,xxx 代表了这个 loader 要做的转换功能,比如 json-loader。
* 理解Plugins
	* 插件件可以完成一些loader不能完成的功能。
	* 插件的使用一般是在 webpack 的配置信息 plugins 选项中指定。
	* CleanWebpackPlugin: 自动清除指定文件夹资源
	* HtmlWebpackPlugin: 自动生成HTML文件并
	* UglifyJSPlugin: 压缩js文件
* 配置文件(默认)
	* webpack.config.js : 是一个node模块,返回一个 json 格式的配置信息对象

2、学习文档 :

  • webpack官网: http://webpack.github.io/
  • webpack3文档(英文): https://webpack.js.org/
  • webpack3文档(中文): https://doc.webpack-china.org/

3、开启项目

  • 初始化项目:
    • 生成package.json文件
    •   {
      "name": "webpack_test",
      "version": "1.0.0"
        } 
      
  • 安装webpack
    • npm install webpack@3 -g //全局安装
  • npm install webpack@3 –save-dev //局部安装

4、编译打包应用

  • 创建入口src/js/ : entry.js
    • document.write(“entry.js is work”);
  • 创建主页面: dist/index.html
  • 编译js
    • webpack src/js/entry.js dist/bundle.js
  • 查看页面效果

5、添加js/json文件

* 创建第二个js: src/js/math.js
    ``` 
    export function square(x) {
      return x * x;
    }
    
    export function cube(x) {
      return x * x * x;
    }
    ```
* 创建json文件: src/json/data.json
    ```
    {
      "name": "Tom",
      "age": 12
    }
    ```
* 更新入口js : entry.js
    ```
    import {cube} from './math'
    import data from '../json/data.json'
    //注意data会自动被转换为原生的js对象或者数组
    document.write("entry.js is work <br/>");
    document.write(cube(2) + '<br/>');
    document.write(JSON.stringify(data) + '<br/>')
    ```
* 编译js:
    ```
    webpack src/js/entry.js dist/bundle.js
    ```
* 查看页面效果

6、使用webpack配置文件

* 创建webpack.config.js
    ```
    const path = require('path'); //path内置的模块,用来设置路径。
    
    module.exports = {
      entry: './src/js/entry.js',   // 入口文件
      output: {                     // 输出配置
        filename: 'bundle.js',      // 输出文件名
        path: path.resolve(__dirname, 'dist')   //输出文件路径配置
      }
    };
    ```
* 配置npm命令: package.json
    ```
    "scripts": {
      "build": "webpack"
    },
    ```
* 打包应用
    ```
    npm run build
    ``` ### 7、打包css和图片文件    * 安装样式的loader
```
npm install css-loader style-loader --save-dev
npm install file-loader url-loader --save-dev
补充:url-loader是对象file-loader的上层封装,使用时需配合file-loader使用。
```   * 配置loader
```
module: {
  rules: [
    {
      test: /\.css$/,
      use: [
        'style-loader',
        'css-loader'
      ]
    },
    {
      test: /\.(png|jpg|gif)$/,
      use: [
        {
          loader: 'url-loader',
          options: {
            outputPath: 'images/', //决定输出文件的位置
            publicPath: '../images/',
            limit: 8 * 1024,  // 8kb大小以下的图片文件都用base64处理
          }
        }
      ]
    }
  ]
}
```   * 向应用中添加2张图片:
* 小图: img/logo.png
* 大图: img/big.jpg
  • 创建样式文件: src/css/test.css
    body {
      background: url('../img/logo.jpg')
    }
    
  • 更新入口js : entry.js
    • import ‘../css/test.css’
  • 添加css样式

     #box1{
      width: 300px;
      height: 300px;
      background-image: url("../image/logo.jpg");
    }
    #box2{
      width: 300px;
      height: 300px;
      background-image: url("../image/big.jpg");
    }
    
  • index.html添加元素

    <div id="box1"></div>
    <div id="box2"></div>
    
  • 执行打包命令:
    npm run build
    

    8、优化css

    将style样式改为link标签引入css

    • 安装插件 npm install –save-dev extract-text-webpack-plugin
    • 引入插件(插件都需要引入) const ExtractTextPlugin = require(“extract-text-webpack-plugin”)
    • 配置Plugins plugins: [ new ExtractTextPlugin({ filename: ‘css/[name].css’ }) ]
    • 修改loader { test: /.css$/, use: ExtractTextPlugin.extract({ fallback: “style-loader”, use: ‘css-loader’ }) }

9、打包html文件

将html文件也打包过去
* 安装插件
	npm install --save-dev clean-webpack-plugin
* 引入插件(插件都需要引入)
	const CleanWebpackPlugin = require('clean-webpack-plugin')
* 配置Plugins
	new HtmlWebpackPlugin({   //html加载
      filename: 'index.html',
      template: 'src/index.html',
    })

10、清除打包文件

打包时将之前的文件夹清空,防止之前的文件干扰
* 安装插件
	npm install --save-dev html-webpack-plugin
* 引入插件(插件都需要引入)
	const HtmlWebpackPlugin = require('html-webpack-plugin');
* 配置Plugins
	new CleanWebpackPlugin('build', {
      root: path.resolve(__dirname, '../')
    }) >以上就是build环境下的设置,可以生成打包后的文件 >命令配置 "build" : "webpack --config webpack.config.build.js"

11、自动编译打包

* 利用webpack开发服务器工具: webpack-dev-server
* 下载
    - npm install --save-dev webpack-dev-server@2 webpack-cli
* webpack配置
      devServer:{//配置此静态文件服务器,可以用来预览打包后项目
	    contentBase: path.resolve(__dirname, 'dist'), //开发服务运行时的文件根目录
	    host: 'localhost', //主机地址
	    port: 8080,  //端口号
	    open: true  //是否自动打开浏览器
	  }
* 命令配置
    - "dev": "webpack-dev-server --config webpack.config.dev.js"
* 编译打包应用并运行
    - npm run dev >以上就是dev环境下的设置,可以自动在内存中生成打包后的文件并打开网页检查效果,有热更新功能。

12、扩展css前缀

* 下载
	npm install --save-dev postcss-loader
* 配置文件
	* 文件名: postcss.config.js
	* 内容:
		module.exports = {
		  "plugins": {
		    "autoprefixer": {
		      "browsers": [
		        "ie >= 8",
		        "ff >= 30",
		        "chrome >= 34",
		        "safari >= 7",
		        "opera >= 23"
		      ]
		    }
		  }
		}

* 修改loader
	{
      test: /\.css$/,
      use: ExtractTextPlugin.extract({
        fallback: "style-loader",
        use: ['css-loader', 'postcss-loader']
      })
    }

13、压缩css

* 修改loader
	{
      test: /\.css$/,
      use: ExtractTextPlugin.extract({
        fallback: "style-loader",
        use: [{
          loader: 'css-loader',
          options: {
            minimize: true  //css压缩
          }
        }, 'postcss-loader',]
      })
    }

14、JS语法转化

* 下载
	npm install --save-dev babel-core babel-loader babel-preset-es2015
* 修改loader
	{
      test: /\.js$/,
      exclude: /node_modules/, //忽略文件
      loader: 'babel-loader',
      query: {
        presets: [
          require.resolve('babel-preset-es2015')
        ]
      }
    }

15、压缩JS

* 下载
	npm install --save-dev uglifyjs-webpack-plugin
* 引入plugins
	const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
* 配置plugins
	new UglifyJsPlugin()

16、压缩html

* 修改plugins
	new HtmlWebpackPlugin({   //html加载及压缩
      filename: 'index.html',
      template: './src/index.html',
      minify: {
        removeComments: true,
        collapseWhitespace: true
      }
    }) >以上就是prod环境下的设置,可以生成打包、压缩、语法转换等的文件 >命令配置 "prod" : "webpack --config webpack.config.prod.js"

上一篇 Gulp介绍

下一篇 vue实用技巧

Comments

Content