webpack 配置记录

webpack 构建说明

github 地址:https://github.com/chick-check/webpack-config-record.git

  1. 创建项目目录
  • test
    • dist
    • src
      • css
      • js
      • images
      • main.js
      • index.html
  1. 初始化项目 npm init -y ,会生成 package.json 文件
  2. 安装 webpack 和 webpack-cli(用于在命令行执行 webpack) npm install webpack webpack-cli --save-dev; 当前版本:webpack@4.29.6 / webpack-cli@3.2.3 生成package-lock.json 和 node_modules
  3. 编写 index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script src = "./main.js"></script>
</body>
</html>
  1. 然后可以通过 webpack ./src/main.js --mode development 将./src/main.js文件打包到 ./dist/main.js; webpack4 默认了打包到的路径,所以像之前的写法会报错。
  2. 每次都通过 webpack ./src/main.js --mode development 打包很麻烦,所以把配置文件写好,然后直接执行 webpack 就好啦。
  3. 编写 webpack 配置文件 webpack.config.js,先根目录添加,在编写。
const path = require('path')

module.exports = {
    mode:'development',
    entry:path.resolve(__dirname, './src/main.js')
}
  1. 试试在 main.js 里写些代码,看能不能渲染到页面上去呢?
/*
 1、首先安装 jquery: npm i jquery
 2、然后导入
 */
import $ from 'jquery'


$(function(){
    $('#tt').css('backgroundColor','lightblue')
})
  1. webpack --watch 可以实时监听,修改保存后自动打包。
  2. 使用 webpack-dev-server 工具也可以实现自动打包编译的功能。这个工具的用法和 webpack 一样。
    安装webpack-dev-server npm i webpack-dev-server -D ,这是项目中安装的,所以无法把 webpack-dev-server 当成命令在终端执行。
    此时在 package.json 配置,之后可以直接执行npm run build 执行 webpack-dev-server,–open 打开本地浏览器 --port 3000 设置端口号 --contentBase 设置路径 --hot 热更新(热更新可以实现编译时部分更新;页面异步更新,而不是刷新整个页面) ;再执行 npm run build 试试。
   "scripts": {
   "test": "echo \"Error: no test specified\" && exit 1",
   "build": "webpack-dev-server --open --port 3000 --contentBase src --hot"
 }

到这里也只是完成了自动编译的功能,修改 main.js 文件并没有实现打包到 dist/main.js,为什么呢?
一下为执行npm run build 时的输出信息,可以看出 webpack 被托管于跟目录,这是因为通过webpack-dev-server 打包的main.js 文件,并没有存到实际的物理磁盘中,而是托管到电脑内存中,所以在项目根目录上,也找不到打包好的 main.js 文件。

test@1.0.0 build /Users/weichaofang/workspaces/test
webpack-dev-server

ℹ 「wds」: Project is running at http://localhost:8080/
ℹ 「wds」: webpack output is served from /
ℹ 「wdm」: Hash: 0122b3897faa80afb5e2

所以修改html 的引入路径,就可以实现效果了。
这么做可以提升速度,还不消耗磁盘。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id = "app">
        <h1 id ='tt'>hello</h1>
    </div>
    <script src="/main.js"></script> <!--引入内存里的 js 文件-->
</body>
</html>
  1. 既然引入的是内存中的 js 文件,那能不能把 html 页面也放到内存中呢?
    使用 html-webpack-plugin 可以实现
  • 首先安装插件 npm i html-webpack-plugin -D
  • 配置 webpack.config.js 文件
  const path = require('path')
const htmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    mode:'development',
    entry:path.resolve(__dirname, './src/main.js'),

    plugins:[
        new htmlWebpackPlugin({//创建内存中生成 html 页面的插件
            template:path.resolve(__dirname,'./src/index.html'), //指定模板页面,根据这个页面生成内存中的页面
            filename:'index.html'
        })
    ]
} 

使用html-webpack-plugin,可以自动在内存中根据指定页面生成内存中的页面;自动把打包好的 main.js 文件追加到页面中,所以不需要指明页面中 js 文件的引用路径。

  1. 在 main.js 中使用 import 引入样式表,保存之后会报错误。
//试试 jQuery
/*
 1、首先安装 jquery: npm i jquery
 2、然后导入
 */
import $ from 'jquery'
import './css/index.css'

$(function(){
    $('#tt').css('backgroundColor','red')
})

这是因为webpack 默认只处理 js 文件,无法处理其他非 js 文件;此时需要手动安装第三方 loader 加载器;
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm i style-loader css-loader -D
之后在配置文件里配置

  module:{
        rules:[
            {
                test:/\.css$/,
                use:['style-loader','css-loader']
            },
            {
                test:/\.scss/,
                use:['style-loader','css-loader','sass-loader']
            },
            { /*
                //webpack 的 css 不能处理 url ,包括图片和字体,所以需要第三方加载器。limit 给定图片大小,单位 byte,
                  如果引入的图片大于等于limit值,不会转化成 base64;name 表示名字和后缀不进行哈希转换,和原来的保持一致;
                  可是hash 保证的图片重名也不会有错,所以还是需要的,可以截取前8位hash值
                */
                test:/\.(jpg|png|gif|bmp|jpeg)$/, 
                use:'url-loader?limit=7632&name=[hash:8]-[name].[ext]'
            },
            {
                test:/\.(ttf|eot|svg|woff|woff2)$/, 
                use:'url-loader'
            },
            {
                test:/\.js$/,
                use:'babel-loader',
                exclude:/node_modules/ //仅转换自己写的 js 文件,排除 node_modules 里的 js 文件
            }
        ]
    } 
  1. webpack ,默认只能处理部分 es6新语法,此时需要借助 第三方 loader 帮助处理成低级语法,之后把结果交给 webpack 打包给 main.js
  • cnpm i babel-core babel-loader babel-plugin-transform-runtime -D
  • cnpm i babel-preset-env babel-preset-stage-0 -D
  • 之后在 webpack 配置文件 module 节点 rules 数组中,添加新的匹配规则在项目根目录,新建 .babelrc 的 Babel 的配置文件,这个配置文件是 json 格式,不能写注释,字符串必须用双引号。【语法】【插件】 是不含 babel-loader 和 babel-preset 的后面部分。
{
    "plugins": ["transform-runtime"],
    "presets": ["env","stage-0"]
}

注意:export default 和 export 是es6 向外暴露成员的方式,两个方式可以一起用,但是export default只能暴露一次,接收时,参数随意;export可以多次暴露,名称不一样,用{名称} 接收,名称 必须和定义时候的一样;module.exports={} 和 exports 是node 向外暴露成员的方式;
导入模块:es6 是 import xx from xx;node 是 var a = require(‘模块标识符’)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值