Webpack 环境搭建

使用webpack搭建环境前,需要有前瞻知识:比如:关于webpack是什么,能做什么以及webpack是基于Node.js环境,对Node.js的安装也是前提条件。一图胜千言,下面直接一步一步 搭建环境,用图示方式说明:

当前实验的Node.js版本为:

步骤一:新建一个web项目:在本机磁盘新建一个文件夹:D:\tfs\web\gitTestProject

我这里使用vscode, 打开gitTestProject文件夹就可以了.

shift+鼠标右键,  点击在此处打开Powershell窗口:

 

 敲入命令:npm init -y 如果 不带-y参数,则是向导式逐个询问提示,需要你填入项目的信息后生成package.json文件,带-y参数则是默认配置。这里入门学习暂时不用-y参数。

步骤二:安装webpack 和webpack-cli 

-cli:common line interface命令行界面。为何还有安装他呢,是因为webpack版本更新太快,webpack 4.0将命令行相关的操作单独集成到了webpack-cli中。要使用高于webpack4.0,需要安装webpack-cli。

 npm i -D webpack webpack-cli  (npm i -D 是npm install --save-dev的简写),是指安装模块并保存到package.json的devDependencies 节点下:

步骤三:在项目根目录下新建三个文件:Index.html、main.js、webpack.config.js

Index.html :启动页面

<html>
    <head>
        <meta charset="utf-8">
    </head>    
    <body>
        <div id="app">MyApp</div>
    </body>
</html>
<script src="./dist/bundle.js"></script>

main.js:入口模块,会用于webpack.config.js下的entry节点配置,这里它的内容为简单输出Hello,world

document.getElementById('app').innerText="Hello,world";

webpack.config.js 内如如下面代码:使用Node.js的功能,__dirname为Node.js的全局变量;output 节点配置webpack的打包输出路径及文件名称;

const path= require("path");
module.exports= {
    entry:"./main.js",
    output:{
        filename:'bundle.js',
        path:path.resolve(__dirname,"./dist"),
    }
}

上面的webpack.config.js是我们手工添加的,也可以使用webpack-cli init 来使用如下图:这里直接手动输入最简单的配置。

 

关于npx是什么,请往下看。

步骤四:有了上面的准备工作后,如何运行Index.html页面呢?

1:利用vscode的插件live server启动一个web server 打开index.html页面。如下图所示:

此时浏览器自然不会输入Hello,world.(注意:vscode设置自动保存后,html页面的改变会通过live server自动更新,采用了websocket的机制通知);

2:利用webpack构建输出:

webpack : 无法将“webpack”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

这个错误很常见:由于webpack非全局安装,自然找不到webpack命令,但本项目是有install webpack的,如何才能引导执行本项目的webpack命令呢?解决方法有:

方法一:执行:.\node_modules\.bin\webpack, (小技巧:在powershell 敲入命令时按tab键自动补充完整;)

 此时页面输出了Hello,World

方法二:npx webpack, 不是npm哦,不要以为是拼写错了,npx是 npm新增命令:参考阮一峰blog:http://www.ruanyifeng.com/blog/2019/02/npx.html

引用一段文字:“npx 想要解决的主要问题,就是调用项目内部安装的模块”。这个不正是我们想要的功能吗?

方法三:如下图所示:

修改package.json的Scripts 节点:添加dev:webpack

然后:npm run dev;

此时页面同样输出了Hello,world字样;

步骤五:修改main.js里的输出为:document.getElementById('app').innerText="Hello,webpack";

发现浏览器还是:Hello,world, 刷新也不会有变化;此时需要npm run dev或npm webpack再次打包更新一次;无法自动更新。

这个要做到自动更新,也是so easy!

修改package.json文件下的scripts节点:把dev 配置值改为: "webpack --watch",让webpack监听文件的变化,当有变化时自动重新构建。

 以上利用了webpack 自身提供的实时预览和live server提供的迷你Http服务器,如果开发编辑工具不是vscode,是其他的sublime、webstorm甚至是dreamweaver呢?

上面的功能可以利用webpack提供的DevServer来完成,

 npm i -D webpack-dev-server 

如果发现npm相当慢,可以切换成cnpm ,切换方式参考文章:npm配置项registry修改为淘宝镜像

在package.json中配置一下:

"scripts": {

"dev": "webpack-dev-server --devtool source-map"

}, 

--devtool source-map 表示开启源码映射,F12 可以看到source源码,调试代码方便使用。

执行npm run dev 时,默认开启了一个端口为:8080的http服务

注意:webpack-dev-server加载会启动webpack,但不会生成物理output文件,放在内存处理,注意引用路径的处理,防止页面报404错误。此处修改Index.html的 <script>引用:<script src="./bundle.js"></script>

步骤六:使用Loader处理 css

Loader: 为webpack的一种机制,webpack 只能处理javascript,但webpack视一切文件为模块,css文件也可以require到js脚本中当做模块处理,但webpack本身不能解析css,于是需要Loader的帮助,

例如:css-loader 则可以让js中载入一个css文件,并将读取到css文件当成一个模块使用,同理:style-loader 就是处理读取后的css内容,例如在页面中动态生成内嵌页面样式;

这里我们使用style-loader,css-loader , npm 先执行安装;

修改webpack.config.js

const path= require("path");
module.exports= {
    entry:"./js/main.js",
    output:{
        filename:'bundle.js',
        path:path.resolve(__dirname,"./dist"),
    },
    module:{
        rules:[
            {
                test: /\.css$/,
                use:['style-loader','css-loader']
            }
        ]
    }
}

 特别注意:module 下rules 中test 的正则表达式:不要加引号,如:test :"/\.css$/",非常容易犯这个错误。

ERROR in ./css/index.css 1:0
Module parse failed: Unexpected token (1:0)
You may need an appropriate loader to handle this file type.

在上面的测试项目中新增css/index.css文件,内容如下:

#app{ color: red;}

然后main.js加入css的引用,此时应该就可以看到样式生效了!

require("../css/index.css");//style-loader!css-loader!

步骤七:加入Plugin:

npm i -D extract-text-webpack-plugin

经过步骤六后 css文件被打包到了bundle.js中,也可以根据需要把css单独打包输出,就需要上面的Plugin了。

安装时报错的处理:Tapable.plugin is deprecated. Use new API on `.hooks` instead

使用下面的指令安装:npm i -D extract-text-webpack-plugin@next

此时package.json的完整配置为:

const path= require("path");
const ExtractTextPlugin = require ('extract-text-webpack-plugin');
module.exports= {
    entry:"./js/main.js",
    output:{
        filename:'bundle.js',
        path:path.resolve(__dirname,"./dist"),
    },
    module:{
        rules:[
            {
                test: /\.css$/,
                loader:ExtractTextPlugin.extract({
                    fallback:'style-loader',//如果不使用css提取,使用什么loader来处理css内容
                    use:'css-loader',
                    publicPath:"./dist"
                })
            }
        ]
    },
    plugins:[
        new ExtractTextPlugin({
            //打包后的文件路径以及文件名
            filename:'/css/[name][hash:8].css',            
        }),
    ]   
}

npx webpack后可以看到dist/css/目录下的变化: 

步骤八:经过上面一步,打包生成的css还不能自动引入Index.html页面,于是再来一个插件html-webpack-plugin

const HtmlWebpackPlugin = require ('html-webpack-plugin');
module.exports= {
   ...
    plugins:[
        ...
        new HtmlWebpackPlugin ({
            template: path.resolve (__dirname, './index.html')
         }),
    ]   
}

 执行npm run dev

此时可以看到css和js自动引入

webpack入门之旅结束,更多配置及Loader,Plugins的学习可以根据实际需要参阅资料,更多话题有待研究学习:比如Vue,React,Angular框架与webpack的结合使用,SCSS,LESS,Stylus等css预编译的处理,ES6语法的转化处理,发布正式上线及自定义Loader或Plugin等。IT有路勤为径,技海无涯苦作舟! 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值