webpack

181 阅读3分钟

webpack 中文文档:www.webpackjs.com/
webpack是基于nodejs实现的,在执行打包压缩的时候是依赖nodejs的。
Node.js 是前端工程化的重要支柱之一

webpack打包后的web工程,不需要一定在nodejs环境中运行 比如在apache中也可以运行

一、基本配置

参考文档:www.jianshu.com/p/537e29f93…
index.html页面导入main.js,,main.js中使用require引入jquery,运行html文件会报错——require没有声明,因为require是在node.js里运行时才有的东西,这时候就需要webpack。
webpack会将import、require等语法解析为es5中浏览器可以兼容的语法,但是它只能解析一些基本的语法,高级的语法需要babel工具

手动配置过程

1、进入指定文件夹,初始化npm

npm init

2、局部安装webpack以及CLI

npm install --save-dev webpack
npm install --save-dev webpack-cli

3、文件结构

main.js中需要jquery,所以首先要本地安装jquery

npm install --save jquery

main.js的内容

var $=require("jquery")

$(function(){
    $("li:odd").css("backgroundColor","cyan")
    $("li:even").css("backgroundColor","gray")
})

4、生成bundle文件

使用命令行 指定出口入口

npx webpack src/main.js --output dist/bundle.js

或者使用配置文件webpack.config.js

const path = require('path');

module.exports = {
  entry: './src/main.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  }
};
npx webpack

5、引入bundle文件

在index.html中引入bundle.js文件

<script src="../dist/bundle.js"></script>

二、webpack-dev-server

安装webpack-dev-server

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

在package.json中添加start代码

  "scripts": {
    ......
    "start": "webpack-dev-server"
  },

在终端中输入如下命令,会打开一个服务器,可以根据提供的端口查看文件

npm run start

webpack-dev-server将打包过后的bundle.js文件存放在内存中,没有存放在磁盘中。这样index.html中引用bundle.js应该从根目录部分引用。

<script src="/bundle.js"></script>

以后不再需要使用 npx webpack 指令

webpack-dev-server的一些参数

1、默认打开端口网页

 "start": "webpack-dev-server --open"

2、修改端口

 "start": "webpack-dev-server --port 3000"

3、修改根路径

 "start": "webpack-dev-server--contentBase src"

4、--hot

--hot参数会使 package.json进行修改并保存后,不会将这个文件再次编译,而是只对修改部分进行修改(增量修改)

这些参数也可以添加在webpack.config.js文件中

devServer:{
    open:true,
    port:3000,
    contentBase:"src",
    hot:true
}
mode:{
    development //模式:开发模式,在这个模式下进行打包
}

三、loader

webpack只能处理js以及json文件,其他文件无法处理,因此要用loader来处理其他文件

css-loader

1、下载css-loader与style-loader

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

2、webpack.config.js中配置

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

3、入口js文件

在main.js文件中添加

require("./css/style.css")

4、启动

npm run start

less-loader

less的编译方式

less.js

vscode 中的easy less

……

对less的处理参照对css的处理

四、插件

为webpack提供一些额外的功能

HtmlWebpackPlugin

1、安装

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

2、配置

在webpack.config.js的module.exports中添加

  plugins: [new HtmlWebpackPlugin({
    template:"src/index.html", //以这个文件为模板进行拷贝
    filename:"indexc.html"
  })]

HtmlWebpackPlugin插件通过指定的模板创建出来的文件也是存放在内存中

会自动将内存中打包后的bundle.js加入页面,因此模板中不需要再引入bundle.js

ES6模块化规范

1、export 与 import from

node中使用exports、module.exports进行模块暴露

es6中使用export关键字来进行模块暴露
使用import from 来进行模块的引入

export function foo(){
    console.log("module1")
}
import {foo} from "./modules/module1.js"

运行后会报错,找不到import,这时就需要webpack进行打包

2、分别暴露

export function foo(){
    console.log("module1")
}
export let bar = ()=>{
    console.log("modules1 bar is called")
}
export const MODULE1_ARR = ["A","B"]

利用解构赋值

import {foo,bar,MODULE1_ARR } from "./modules/module1"

foo()
bar()
console.log(MODULE1_ARR)

3、统一暴露

let bar = ()=>{
    console.log("modules1 bar is called")
}
let bar2 = ()=>{
    console.log("modules1 bar2 is called")
}
let bar3 = ()=>{
    console.log("modules1 bar3 is called")
}
export(bar,bar2)

4、默认暴露

export default {
    msg:"module3中的msg",
    foo(){
        console.log("module3 foo is called")
    },
    bar(){
        console.log("module3 bar is called")
    }
}

这时候不需要解构

import module3 from "./modules/module3"

module3.foo()
module3.bar()
console.log(module3.msg)