详解webpack打包nodejs项目(前端代码)


Posted in NodeJs onSeptember 19, 2018

随着前端体积越来越大,功能越来越丰富,这时候就需要将前端工程化,而webpack就是用于将前端各种文件打包起来。一个简单的webpack应该包含以下几个概念

  • 入口起点
  • 输出
  • 配置
  • 组件
  • 加载器
  • 插件
  • 模块
  • 模块热替换

适用情况

首先说明,此情况不具备普遍性。若你的情况与笔者类似那么希望这篇文章能够帮到你。

我的项目情况是这样的:用node.js做后台,ejs做模板引擎(即整个页面是一个ejs文件)由node.js将数据渲染完成后,再将完整页面返回给用户。

那么这样做会遇到的问题:

1. 本项目没有html页面,ejs的作用也不是引入公共的组件,直接就是一个完整的页面,用webpack中处理ejs文件的loader返回的是一个函数,故会产生问题

2.由于node.js配置了静态资源目录public,而视图目录与之同级,webpack在处理图像等静态资源目录的路径的时候会产生问题

3.如果使用publicpath 那么nodejs在运行的时候就会找不到资源,因为设置了静态资源的目录

如果你也遇到了类似的问题,希望你能在本文中找到解决方法。

这里多说一句:不要觉得我的项目很奇怪,因为我当时写的时候,知识储备不足,等到后面发现不妥的时候,为时已晚。

改起来太麻烦,所以将错就错了。。。。。。

解决方案

1.处理ejs

我在各个论坛,官网搜寻良久,始终没能找到,能处理我这种情况的loader。

没有办法之下,只能换一个思路,将ejs文件先转为html

首先要修改文件,那么就要修改服务器的模板引擎(这里是我的app.js)

详解webpack打包nodejs项目(前端代码)

那么要修改成什么呢?我要让nodejs使用ejs模板引擎,但是使用html文件来渲染

这里我们要用的是express中的app.engine 来注册一个引擎

代码如下:

app.set('views',path.join(__dirname,'views'));//设置模板引擎的目录
app.engine('html', require('ejs').renderFile);
app.set('view engine','html');

这样我们就可以将原本views视图目录中的ejs文件的后缀修改为.html了

2.webpack处理html文件

首先引入我眼帘的是webpack插件:HtmlWebpackPlugin

我找了许多文章,文章中对html文件的处理无一列外都用到了这个插件

既然那么多人用,那么它的强大是毋庸置疑的。

但是配置好后运行webpack,报了一个locals未定义的错误

报错代码:

详解webpack打包nodejs项目(前端代码)

由于locals是由express中的res.render()传回页面的数据,而在此时webpack处理的时候,理所当然的会报未定义的错误了。

那么这个问题怎么解决呢?

我现在需要让webpack帮我处理html中的资源,又要让webpack不要理会ejs的语法,帮我继续压缩代码,就陷入了一个十分难受的境地。

在搜寻良久无果后,一篇误打误撞的文章启发了我

详解webpack打包nodejs项目(前端代码)

这篇文章的博主是希望,webpack能够把ejs引入的模板打包到一个页面中,而我恰恰相反,我就是需要webpack不理会我的ejs代码。

于是解决办法氤氲而生。

首先我将原本html中的js代码抽离到test.js中

然后以这个js文件为入口文件,再以原本的html文件为模板

用HtmlWebpackPlugin来生成我所需要的压缩过后的html

解决代码

webpack.config.js

'use strict';
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');


//打包ejs

module.exports = {
 entry: {
 test: './test.js',//入口文件 即一般来说app.js
 },
 mode:"production",//生产环境
 output: {
 path: path.resolve(__dirname,'build'),//输出路径
 filename: 'js/[name]/[name].js'//输出后的文件名
 },
 externals: {
 jquery:'window.jQuery'
 },//外部加载的资源 这些都是不需要进行打包的
 module: {
 rules: [//设置处理js文件的loader
  {test:/\.js$/,use:'babel-loader',exclude:/node_modules/},
  {test:/\.css$/,use:["style-loader","css-loader"]},
  {
  test: /\.(png|jpg|gif)$/,
  use: [
   {
   loader: 'file-loader',
   options: {
    name: 'images/[name].[ext]'
   }
   }
  ]
  },
  {
  test: /\.(html)$/,
  use: {
   loader: 'html-loader',
   options: {
   attrs: [':data-src']
   }
  }
  }
 ]
 },
 plugins:[
 new HtmlWebpackPlugin({
  name:'test',
  template:'./public/init.html',//模板文件
  filename:'views/test.html',//目标文件
  minify:{
  collapseWhitespace:true,
  collapseInlineTagWhitespace:true,
  conservativeCollapse:true,
  minifyCSS:true,
  minifyJS: true,
  removeComments:true,
  trimCustomFragments:true
  }
 })
 ],
 optimization: {
 minimize: true//是否压缩代码
 }
};

上面的minify参数主要是配置html压缩的

入口文件test.js

这里面没有任何有关webpack的代码,全是项目的业务代码,故在这里就不粘了

运行webpack 大功告成

详解webpack打包nodejs项目(前端代码)

我们来看看打包前后的html

打包前:

详解webpack打包nodejs项目(前端代码)

打包后

详解webpack打包nodejs项目(前端代码)

大小对比

详解webpack打包nodejs项目(前端代码)

启动nodejs服务器

详解webpack打包nodejs项目(前端代码)

问题解决 睡觉咯~~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
NodeJS 模块开发及发布详解分享
Mar 07 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 NodeJs
nodejs中使用多线程编程的方法实例
Mar 24 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 21 NodeJs
Nodejs调用Dll模块的方法
Sep 17 #NodeJs
nodejs中express入门和基础知识点学习
Sep 13 #NodeJs
NodeJS 实现多语言的示例代码
Sep 11 #NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 #NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 #NodeJs
Nodejs Express 通过log4js写日志到Logstash(ELK)
Aug 30 #NodeJs
NodeJS如何实现同步的方法示例
Aug 24 #NodeJs
You might like
基于php-fpm的配置详解
2013/06/03 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
HTML颜色选择器实现代码
2010/11/23 Javascript
jquery队列函数用法实例
2014/12/16 Javascript
学习使用bootstrap基本控件(table、form、button)
2016/04/12 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
在vue中使用公共过滤器filter的方法
2018/06/26 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
python多线程http下载实现示例
2013/12/30 Python
用Python遍历C盘dll文件的方法
2015/05/06 Python
Python lxml模块安装教程
2015/06/02 Python
python模块之time模块(实例讲解)
2017/09/13 Python
详解python3中的真值测试
2018/08/13 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
Python 求数组局部最大值的实例
2019/11/26 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
html5 canvas 画图教程案例分析
2012/11/23 HTML / CSS
全面解析HTML5中的标准属性与自定义属性
2016/02/18 HTML / CSS
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
五好关工委申报材料
2014/05/31 职场文书
个人承诺书格式范文
2015/04/29 职场文书
委托收款证明
2015/06/23 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers