webpack入门及使用

webpack

模块打包机:分析你的项目结构,找到其中的javaScript模块以及一些其他不能直接被浏览器运行的拓展语言(Scss、TypeScipt)并将其转换和打包为适合浏览器运行的格式。

  • 安装

webpack4之后webpack-cli被抽离出来了,需要单独安装。如果没有安装运行的时候会提示One CLI for webpack must be installed.


$ npm install -g webpack

$ npm install -g webpack-cli

  • npm配置文件

创建npm配置文件package.json


$ npm init -y

  • 安装webpack依赖包

$ npm install webpack --save-dev

  • 目录结构

├── app
│   ├── mian.js
│   └── Greeter.js
└── public
    ├── index.html
    └── bundle.js(webpack打包后生成)

  • 创建基础的index.html

index.html:


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
     //bundle.js为webpack打包后生成的文件
    <script src="bundle.js"></script>
  </body>
</html>

  • 我们再创建一个模块Greeter(根据CommonJS规范命名一个模块)

Greeter.js:


module.exports = function() {
  var greet = document.createElement('div');
  greet.textContent = "Hello World!";
  return greet;
};

main.js加载模块

main.js:


const greeter = require('./Greeter.js');
document.body.appendChild(greeter());


  • 运行webpack
 // webpack {{入口文件路径}} -o {{打包后文件存放路径}}           
$ webpack app/main.js -o public/bundle.js --mode development


打开index.html

通过配置文件使用webpack

webpack除了上述的打包功能还有很多高级的功能,如果仅仅通过命令行的形式,不但不方便而且容易出错。

  • 我们在根目录创建一个配置文件webpack.config.js

"__dirname"是node.js中的一个全局变量,它指向脚本执行的当前路径。

webpack.config.js:


module.exports = {
  // 入口文件路径
  entry:  __dirname + "/app/main.js",
  // 打包后的输出
  output: {
    // 输出路径
    path: __dirname + "/public",
	// 输出文件名
    filename: "bundle.js"
  }
}

  • package.json中添加mode配置

development:开发者模式侧重功能调试 production:发布模式侧重模块体积优化及线上部署


"scripts": {
  "dev": "webpack --mode development",
  "build": "webpack --mode production"
}

  • 运行webpack

搭建本地服务器

  • 安装组件

$ npm install webpack-dev-server --save-dev

  • webpack.config.js添加配置

webpack-dev-server实时编译后的文件都保存到了内存当中,所以在目录中看不到编译后的文件


module.exports = {
  devServer: {
    // 本地服务器加载页面所在的路径
    contentBase: __dirname + "/public",
    historyApiFallback: true,
	// 实时刷新
    inline: true
  } 
}

  • 运行服务器

我们修改Greeter.js以后会自动编译,然后刷新页面。

自动刷新 html、css

server只会实时编译js文件,html、css文件并不自动刷新所以我们需要安装相应的插件

html


$ npm install html-webpack-plugin --save-dev

webpack.config.js文件添加配置


const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry:  __dirname + "/app/main.js",
  output:{
    path: __dirname + "/public",
    filename: "bundle.js"
  },
  devServer:{
	contentBase: __dirname + "/public"
  },
  plugins: [new HtmlWebpackPlugin({                 
    template: __dirname + "/public/index.html",
    filename: 'index.html',
    inject: 'body'
  })]
}

css


$ npm install style-loader css-loader --save-dev

webpack.config.js文件添加配置


  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          { loader: "style-loader" },
          { loader: "css-loader" }
        ]
      }
    ]
  }

我们在public文件夹下创建index.css文件


body{
	color:#0000ff;
}

在main.js导入


import '../public/index.css';

const greeter = require('./Greeter.js');
document.body.appendChild(greeter());

现在我们修改css及html文件都会得到动态的刷新

Loaders

Loaders是webpack提供的最激动人心的功能之一了。通过使用不同的loader,webpack有能力调用外部的脚本或工具 如 scss -> css ES6 -> ES5 JSX -> JS

我们在上面就用到了style-loader,css-loader来动态刷新css

Loaders配置

  • test : 匹配loaders处理文件的扩展名的正则表达式

  • include : 手动添加需要处理的文件

  • exclude : 需要屏蔽不进行处理的文件

  • loader : loaders名称 use的快捷配置方式

  • use : 所使用的loaders列表

more in webpack

Loaders使用(label)

Loaders的使用大致和上面style-loader css-loader类似,再拿label为例

  • Babel是一个JavaScript的编译平台,它可以编译现在浏览器没有完全支持的ES6及基于JavaScipt的扩展语言(React的JSX等)

  • 安装


$ npm install babel-loader babel-core babel-preset-es2015 --save-dev

  • webpack.config.js文件添加配置

module: {
		rules: [{
			test: /\.js$/,
			use: {
				loader: "babel-loader"
			},
			exclude: /node_modules/
		}]
	}

Plugins

Plugins是用来拓展Webpack功能的,它们会在整个构建过程中生效,执行相关的任务。而loaders是在项目打包构建的过程中用来处理源文件。

Plugins使用

  • 安装

我们需要通过npm根据需求来安装我们需要的插件


$ npm install plugins-name --save-dev

  • 配置

Plugins必须在webpack.config.js配置,并向plugins属性中传入new的实例。

我们在上面使用html-webpack-plugin ,你会发现我们使用require方法引入了我们需要的插件


const HtmlWebpackPlugin = require('html-webpack-plugin')

然后在plugins属性中new了一个实例


new HtmlWebpackPlugin({                 
    template: __dirname + "/public/index.html",
    filename: 'index.html',
    inject: 'body'
  })

并且传入了配置参数,然后插件就会在整个构建过程中生效,执行任务。

other

编写一个loader

编写一个plugin

posted @ 2018-12-11 15:58  可爱的黑精灵  阅读(264)  评论(0编辑  收藏  举报