webpack4.x笔记-配置基本的前端开发环境一

webpack的基本使用

webpack 本质上是一个打包工具,它会根据代码的内容解析模块依赖,帮助我们把多个模块的代码打包。借用 webpack 官网的图片:

虽然webpack4.x的版本可以零配置开始构建,但是在实际的项目中需要其它的一些功能,还是需要一个配置文件。

安装

下面一步一步讲解配置一个基本的前端开发环境过程。

首先自己环境中安装了有node(自带npm)。如果你的项目中没有package.json,那么需要使用npm init。

会在项目下生成一个package.json文件,其中会有如下代码:

{
  "name": "test","version": "1.0.0": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },"author": ""
}

我们现在来使用npm来安装webpack,可以作为一个全局的命令来使用:

npm install webpack webpack-cli -g 

其中webpack-cli是使用webpack的命令行工具。在 4.x 版本之后不再作为 webpack 的依赖了,我们使用时需要单独安装这个工具。

更多的时候我们是把webpack作为项目的依赖来安装使用的。

npm install webpack webpack-cli -D 

package.json文件就会多了如下配置:

"devDependencies": {
    "webpack": "^4.27.1"
  }

我们在package.json中添加一个npm scripts:

代码如下:

"scripts": {
    "build": "webpack --mode production"
  }

然后我们创建一个'./src/index.js',其中index.js中的代码任意写,如:

export default {
    a:'字符串'
}

然后执行npm run build后会在项目下增加了一个dist文件夹,里面存放了webpack构建好的main.js文件。

因为是作为项目依赖进行安装,所以不会有全局的命令,npm 会帮助我们在当前项目依赖中寻找对应的命令执行,如果是全局安装的 webpack,直接执行webpack --mode production就可以。

webpack重要的几个概念

webpack 的几个重要的概念:入口,loader,plugin,输出。

入口

所谓入口,就是webpack的构建入口。webpack会读取这个文件,并从它这儿开始解析依赖,然后进行打包。如上面操作,一开始webpack默认的构建入口就是'./src/index.js'

在我们的项目中,如果是单页面应用,一般就只有一个入口;如果是多页面,那么就会配置成一个页面一个构建入口。

入口可以使用entry字段来设置,webpack支持配置多个入口进行构建打包:

module.exports = {
  entry: './src/index.js' 
}

// 上述配置等同于
module.exports = {
  entry: {
    main: './src/index.js'
  }
}

 或者配置多个入口
module.exports = {
  entry: {
    foo: './src/page-foo.js' ...
  }
}

 使用数组来对多个文件进行打包
module.exports = {
  entry: {
    main: [
      './src/foo.js'
    ]
  }
}

最后的例子,可以理解为多个文件作为一个入口,webpack 会解析两个文件的依赖后进行打包。

loader

webpack 中提供一种处理多种文件格式的机制,便是使用 loader。我们可以把 loader 理解为是一个转换器,负责把某种文件格式的内容转换成 webpack 可以支持打包的模块。

举个例子,比如你的入口文件index.js引入了css样式,那么构建的时候就需要用css-loader来处理这些.css文件,同时还需要style-loader。最终打包的结果就是把不同类型的文件都解析成js代码,以便在打包后能在浏览器中运行。

当我们需要使用不同的 loader 来解析处理不同类型的文件时,我们可以在module.rules字段下配置相关的规则,比如使用babel来转化js代码:

module: {
    rules: [
    {
      test: /\.jsx?/, 匹配文件路径的正则表达式,通常我们都是匹配文件类型后缀
      include: [
        path.resolve(__dirname,'src')  指定哪些路径下的文件需要经过 loader 处理
      ],use: 'babel-loader',1)"> 指定使用的 loader
    },],}

后面有笔记会详细记录下loader的使用以及怎样开发loader。

plugin

在webpack的构建工作中,除了用loader来处理模块代码的转换,剩下的工作就是用plugin来完成,下面列举常用的几个:

  • 压缩JS代码:uglifyjs-webpack-plugin
  • 关联JS生成html页面:html-webpack-plugin
  • 生成CSS文件: extract-text-webpack-plugin
  • 定义环境变量:DefinePlugin

JS代码压缩配置如下:

const UglifyPlugin = require('uglifyjs-webpack-plugin')

module.exports = {
  plugins: [
    new UglifyPlugin()
  ],}

输出

webpack 的输出即指 webpack 最终构建出来的静态文件。构建结果的文件名、路径等都是可以配置的,使用output字段:

module.exports = {
    output: {
    path: path.resolve(__dirname,'dist'),filename: 'bundle.js' 或者多个入口生成不同文件
module.exports = {
  entry: {
    foo: './src/foo.js''[name].js' 路径中使用 hash,每次构建时会有一个不同 hash 值,避免发布新版本时线上使用浏览器缓存
module.exports =  output: {
    filename: '[name].js'

我们刚开始构建的webpack,默认的构建结果就是'./dist/main.js'

一个简单的webpack配置例子

上面总结了几个webpack的重要概念后,来看一个简单的配置例子,webpack运行时默认读取项目下的webpack.config.js文件作为配置,那么我们现在就在项目下创建一个webpack.config.js文件:

const path = require('path')
const UglifyPlugin = require('uglifyjs-webpack-plugin') js压缩插件

module.exports = {
    entry:'./src/index.js'
    },module:{
        rules:[
            {
                test:/\.jsx?/,1)">匹配js,jsx文件
                include:[
                    path.resolve(__dirname,'src')
                ],use:'babel-loader'
            }
        ]
    },1)"> 代码模块路径解析的配置
    resolve: {
        modules: [
          "node_modules")
        ],extensions: [".wasm",".mjs",".js",".json",".jsx"],plugins:[
        new UglifyPlugin() 使用uglifyjs-webpack-plugin压缩JS代码
        根据上面第一次的构建,你会发现webpack默认使用了JS的代码压缩插件
        这其实也是命令中的 --mode production的效果
    ]
}

当你直接运行npm run build命令的时候,会报错Cannot find module 'uglifyjs-webpack-plugin'。这儿你需要安装如下内容:

  • 1.npm install uglifyjs-webpack-plugin --save-dev
  • 2.npm install -D babel-loader@7 babel-core babel-preset-env webpack
  • 3.最后执行npm run build能看到在dist文件夹下生成了一个bundle.js构建完成的文件。

vue脚手架vue-cli的webpack配置

vue-cli 使用 webpack 模板生成的项目文件中,webpack 相关配置存放在 build 目录下。现在的脚手架vue-cli的webpack好像还是用的webpack3.x版本,要注意下版本区别。

构建基本的前端开发环境

 我们构建基本的前端开发环境需要做哪些事情:

  • 构建我们发布需要的 HTML、CSS、JS 文件
  • 使用 CSS 预处理器来编写样式
  • 处理和压缩图片
  • 使用 Babel 来支持 ES 新特性
  • 本地提供静态服务以方便开发调试

下面围绕这些要求要构建开发环境。

JS关联HTML页面html-webpack-plugin

当我们构建打包完成生成了JS文件,怎样把JS文件跟html页面相关联呢,也就是html怎样引入js文件。当然可以使用script标签引入js文件,但是如果打包构建的js路径变化或者使用了hash命名,那么直接引入js文件就不合理了,这时就需要使用html-webpack-plugin

把html-webpack-plugin安装到项目依赖中去:

npm install html-webpack-plugin -D 

首先自己按照下列目录创建模板html文件,‘./src/assets/index.html’,html内容随便写,如下:

<!DOCTYPE html>
<html>
    head>
        meta charset="utf-8"title>这是构建的第一个web页面</body>

将html-webpack-plugin配置到webpack.config.js中的plugins列表中:

module.exports =  plugins: [
     HtmlWebpackPlugin({
      filename: 'index.html',1)"> 配置输出文件名和路径
      template: 'assets/index.html',1)"> 配置文件模板
    }),}

这样,通过 html-webpack-plugin 就可以将我们的页面和构建 JS 关联起来,这样将会产生一个包含以下内容的文件dist/index.html。打开index.html可以看到构建后的代码如下:

script type="text/javascript" src="bundle.js"></script>

详细了解可参考文档html-webpack-plugin, 官网提供的例子html-webpack-plugin/examples/

 构建CSS

我们构建CSS需要使用css-loader和style-loader。

module.exports = {
  module: {
    rules: [
            {
        test: /\.css/'css-loader'
import './index.css'

index.css里面随便编写一段css代码:

.title{
    font-weight: bold;
    font-size:20px;
    color:red;
}

模板index.html改成如下:

><%= htmlWebpackPlugin.options.title %>div class="title">这是一个主题div>

安装style-loader与css-loader:

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

现在执行npm run build,然后去看生成的index.html,效果有了,css样式添加上了。但是并没有生成css文件。

解释下css-loader跟style-loader的作用:

  • css-loader 负责解析 CSS 代码,主要是为了处理 CSS 中的依赖,例如@importurl()等引用外部文件的声明;
  • style-loader 会将 css-loader 解析的结果转变成 JS 代码,运行时动态插入style标签来让 CSS 代码生效。

如果需要单独把 CSS 文件分离出来,我们需要使用extract-text-webpack-plugin.

由于webpack4.x的extract-text-webpack-plugin版本还没有发布正式版,安装的时候需要指定使用它的 alpha 版本:

npm install extract-text-webpack-plugin@next -D

配置:

const ExtractTextPlugin = require('extract-text-webpack-plugin'  module: {
    rules: [
      {
        test: /\.css$/ 因为这个插件需要干涉模块转换的内容,所以需要使用它对应的 loader
        use: ExtractTextPlugin.extract({ 
          fallback: 'style-loader' 引入插件,配置文件名,这里同样可以使用 [hash]
    new ExtractTextPlugin('index.css'然后就会在dist文件夹下多生成一个index.css文件。详细可参考:extract-text-webpack-plugin

CSS 预处理器

通常我们在编写css的时候,经常使用less或者sass等css预处理器,我们以less为例,我们把index.css改成index.less如下:

@fontSize:20px;
.title{@fontSize;red;
}

安装less-loader,官网文档对应loader:

npm install --save-dev less-loader less

 对应的配置文件修改为:

module.exports =  module: {
    rules: [
      {
        test: /\.less$/'less-loader' ...
}

 处理图片文件file-loader及增强版url-loader

file-loader

虽然css-loader会解析样式中用url()引用的文件路径,但是图片有jpg/png/gif格式,webpack处理不了,需要使用一个loader配置才行,这就用到了file-loader。

file-loader 可以用于处理很多类型的文件,它的主要作用是直接输出文件,把构建后的文件路径返回。

配置如下:

module.exports =  module: {
    rules: [
      {
        test: /\.(png|jpg|gif)$/

安装file-loader,官方文档file-loader:

npm install --save-dev file-loader

我在index.js引入一张图片:

import '../assets/a.jpg'

运行结果默认在dist目录下生成了78414f2de9fc47d29f335727a717bc3d.jpg。默认情况下,生成的文件的文件名就是文件内容的 MD5 哈希值并会保留所引用资源的原始扩展名。

当然也可以配置输出路径,文件名称等,如下:

{
    test:/\.(jpg|png|gif)$/'[path][name].[ext]'
            }
        }
    ]
}        

url-loader

 安装url-loader,详细文档请参考官网url-loader

url-loader功能类似于file-loader,但是在文件大小(单位 byte)低于指定的限制时,可以返回一个 DataURL。

npm install --save-dev url-loader

配置:

module.exports = {
  module: {
    rules: [
      {
        test: /\.(png|jpg|gif)$/i,use: [
          {
            loader: 'url-loader'
            }
          }
        ]
      }
    ]
  }
}

使用 Babel

Babel是一个让我们能够使用 ES 新特性的 JS 编译工具,我们可以在 webpack 中配置 Babel,以便使用 ES6、ES7 标准来编写 JS 代码。

前面已经写过配置了,代码如下:

module.exports =  module: {
    rules: [
      {
        test: /\.jsx?/,1)"> 支持 js 和 jsx
        include: [
          path.resolve(__dirname,'src'),1)"> src 目录下的才需要经过 babel-loader 处理
        ],loader: 'babel-loader'.babelrc

使用 webpack-dev-server启动静态服务

我们可以使用 webpack-dev-server 在本地开启一个简单的静态服务来进行开发。

安装webpack-dev-server:

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

然后添加启动命令到 package.json 中:

"scripts": {
  "build": "webpack --mode production"
}

然后运行npm run start,然后就可以访问 http://localhost:8080/ 来查看你的页面了。默认是访问 index.html,如果是其他页面要注意访问的 URL 是否正确。

总结

根据上面的配置,我们已经完成了配置一个简单的前端开发环境,实现了:构建 HTML、CSS、JS 文件、使用 CSS 预处理器来编写样式、处理和压缩图片、使用 Babel、方便开发调试的静态服务。下面的笔记会记录webpack的一些细节来更好的了解webpack。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


一准备工作umi为react的一个封装比较nice的脚手架。优点当然就是安装方便,开箱即用,集成了诸多好用功能,详见官网。当然缺点就是无法暴露原始的webpack.config.json文件,只能按照官方文档上特定的方法进行修改,而文档却并不完善。项目顺利进行大家笑嘻嘻,一旦遇到偏难怪需求,
webpack在引入两个依赖的包时,可能需要使用shimming,意思是处理代码上的兼容1、在main.js中引入jqueryimport$from'jquery'importappendfrom'./append'//下面的给页面添加元素文件append()2、append.js使用main.js的$向页面中添加元素functionappDomFunc(){
  Happypack (plugin)多线程使用loader编译文件treeshaking删除无用JS代码,依赖ESM规范source-map生产环境一定去掉process.env.XXX配置环境变量,区分各种编译环境splitchunks 代码分离去重DynamicImport动态加载js文件Hot-module-replacement开发环境热更新w
一目录结构├──build//构建相关├──config//配置相关├──src//源代码│├──api//所有请求│├──assets//主题字体等静态资源│
接着第一节的demo现在我们尝试整合一些其他资源,比如图像,看看webpack如何处理。在webpack出现之前,前端开发人员会使用grunt和gulp等工具来处理资源,并将它们从 /src 文件夹移动到 /dist 或 /build 目录中。同样方式也被用于JavaScript模块,但是,像webpack这样的工
webpack的打包原理识别入口文件通过逐层识别模块依赖(Commonjs、amd或者es6的import,webpack都会对其进行分析,来获取代码的依赖)webpack做的就是分析代码,转换代码,编译代码,输出代码最终形成打包后的代码什么是loaderloader是文件加载器,能够加载资源文件,并对这些文件进行
上一篇文章我们在一个demo中见到了webpack的身影,如果从未接触过webpack的同学学完了上一篇文章可能会觉得webpack只是一个“翻译官”,但事实上webpack可不仅仅可以‘翻译’代码,事实上,webpack是一个‘打包’工具,‘打包‘才是webpack的核心任务。打开webpack的官网:webpack中
注:本章将配合Vue详细讲解webpack前提条件1.在开始之前,请确保安装了Node.js和npm的最新版本。使用旧版本,你可能遇到各种问题,因为它们可能缺少webpack功能以及/或者缺少相关package包。在cmd中node-v,npm-v可查看对应的版本和安装情况。2.这里会用到ES6的模块化,如果你
前言、之前我认为对于项目的优化无非是从代码上去优化一些东西,比如循环呀函数式调用呀让你的代码看起来更加的简洁容易懂后来我在面试过程中不断有面试官不断地问了我这些问题所以自己就去研究了一下发现并不是我之前想的那样,一个好的webapck优化的胜过于你在整体代码上
##一、组件component###1.什么是组件?组件(Component)是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码组件是自定义元素(对象)###2.定义组件的方式方式1:先创建组件构造器,然后由组件构造器创建组件方式2:直接创建组件###3.组件的分
 #webpack5概述>webpack是一个现代javascript应用程序的**静态模块打包器(modulebundler)**>>vue-cli脚手架环境,集成了webpack,所以才能对各类文件进行打包处理[webpack官网](https://webpack.js.org/) ##webpack能做什么webpack是一个静态模块打包
//这里导入webpack配置,我用对象的形式表示,当然entry属性上定义的文件要有//constconfig=require("./webpack.config");constconfig={entry:'./src/index.js'};const{join,dirname}=require("path");const{readFileSync,writeFileSync}=requi
安装cnpminstallwebpack-bundle-analyzer-D 修改vue.config.jsmodule.exports={chainWebpack:config=>{if(process.env.use_analyzer){//分析config.plugin('webpack-bundle-analyzer')
webpack打包html插件html-webpack-plugin的使用1.创建这样的测试目录结构1)index.html是即将被打包的文件,你可以随便写一些内容2)index.js是打包的入口文件,你可以写或不写内容2.webpack.config.js的代码如下:/***压缩html需要插件:html-webpack=plugin*插件使用方法:
vueinitwebpacktabbar创建vue项目时出现问题vue:无法加载文件C:\Users\dengqian\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。C:\Windows\System32\WindowsPowerShell\v1.0,找到如上路径,以管理员身份运行powershell.exe即可输入set-ExecutionPolicyRemo
在webpack中使用ECharts【官网教程】1、使用如下命令通过npm 安装EChartsnpminstallecharts--save2、全局引用在main.jsimportechartsfrom'echarts'Vue.prototype.$echarts=echarts;3、运用<divstyle="width:60vw;height:280px;"ref="chart"&
如果没有看过我的上一篇文章,请先移步去看一下哈!时隔一年多,之前写的文章感觉大家还挺喜欢的,一直说要更新下一篇。但是一直没有机会,没时间,还有就是,感觉自己的技术,可能不足以支持我继续往下走。但是经过这个一年多的历练,感觉很多东西考虑的会更周全,不负期待!废话说一堆,步入正题
dist文件配置对应的路由名展示这样的效果可以创建一个本地的服务还可以进行代理项目开发是在src里进行代码逻辑编写./表示本地路径/表示绝对路径(nginx需要配置)
 1、用命令创建webpack模板项目vueinitwebpack 项目名,需要选是否的统一选否,所以的依赖手动添加  2、安装依赖vue-router,elementui,sass-loader,node-sass,axios插件安装路由:npminstallvue-router安装elementu
最近想把蘑菇博客部署到k8s上,作为一名java搬砖工,搬砖人不讲码德,biu一下就把后端各模块的dockerfile和chart包copy过来了,很快啊!接下来就可以愉快的使用helm管理蘑菇后端服务部署了。部署完后端服务后,准备制作前端镜像,发现前端打包后,无法动态读取系统环境变量,这很头疼,难不