webpack入门笔记

2018年8月25日更新,目前 webpack 已经更新值 4.17.1 ,本文所用到的各种库或多或少有些过时,跟着代码操作下来可能会遇到各种问题,不过 webpack 的主体思想没变,所以还是希望本文对新学 webpack 的你,有所帮助。此外用基于 webpack 4.17.1 写了一个简单的demo,如果遇到啥问题,可以参考,之后应该会逐步来完善这个demo,如果有啥通用的想实现的功能,也可以在里面提 issue。

2017年12月7日更新,添加了clean-webpack-plugin,babel-env-preset,添加本文涉及到的所有代码的示例,如果你在学习过程中出错了,可点击此处参考(有些过时了,不要再 fork 了)

写在前面的话

阅读本文之前,先看下面这个webpack的配置文件,如果每一项你都懂,那本文能带给你的收获也许就比较有限,你可以快速浏览或直接跳过;如果你和十天前的我一样,对很多选项存在着疑惑,那花一段时间慢慢阅读本文,你的疑惑一定一个一个都会消失;如果你以前没怎么接触过Webpack,而你又你对webpack感兴趣,那么动手跟着本文中那个贯穿始终的例子写一次,写完以后你会发现你已明明白白的走进了Webpack的大门。

// 一个常见的`webpack`配置文件const webpack = require('webpack');const HtmlWebpackPlugin = require('html-webpack-plugin');const ExtractTextPlugin = require('extract-text-webpack-plugin');module.exports = {        entry: __dirname + "/app/main.js", //已多次提及的唯一入口文件        output: {            path: __dirname + "/build",            filename: "bundle-[hash].js"        },        devtool: 'none',        devServer: {            contentBase: "./public", //本地服务器所加载的页面所在的目录            historyApiFallback: true, //不跳转            inline: true,            hot: true        },        module: {            rules: [{                    test: /(\.jsx|\.js)$/,                    use: {                        loader: "babel-loader"                    },                    exclude: /node_modules/                }, {                    test: /\.css$/,                    use: ExtractTextPlugin.extract({                        fallback: "style-loader",                        use: [{                            loader: "css-loader",                            options: {                                modules: true,                                localIdentName: '[name]__[local]--[hash:base64:5]'                            }                        }, {                            loader: "postcss-loader"                        }],                    })                }            }        ]    },    plugins: [        new webpack.BannerPlugin('版权所有,翻版必究'),        new HtmlWebpackPlugin({            template: __dirname + "/app/index.tmpl.html"//new 一个这个插件的实例,并传入相关的参数        }),        new webpack.optimize.OccurrenceOrderPlugin(),        new webpack.optimize.UglifyJsPlugin(),        new ExtractTextPlugin("style.css")    ]};

什么是WebPack,为什么要使用它?

为什要使用WebPack

现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包。为了简化开发的复杂度,前端社区涌现出了很多好的实践方法

模块化,让我们可以把复杂的程序细化为小的文件;

类似于TypeScript这种在JavaScript基础上拓展的开发语言:使我们能够实现目前版本的JavaScript不能直接使用的特性,并且之后还能转换为JavaScript文件使浏览器可以识别;

Scss,less等CSS预处理器

...

这些改进确实大大的提高了我们的开发效率,但是利用它们开发的文件往往需要进行额外的处理才能让浏览器识别,而手动处理又是非常繁琐的,这就为WebPack类的工具的出现提供了需求。

什么是Webpack

WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。

WebPack和Grunt以及Gulp相比有什么特性

其实Webpack和另外两个并没有太多的可比性,Gulp/Grunt是一种能够优化前端的开发流程的工具,而WebPack是一种模块化的解决方案,不过Webpack的优点使得Webpack在很多场景下可以替代Gulp/Grunt类的工具。

Grunt和Gulp的工作方式是:在一个配置文件中,指明对某些文件进行类似编译,组合,压缩等任务的具体步骤,工具之后可以自动替你完成这些任务。

Webpack的工作方式是:把你的项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个(或多个)浏览器可识别的JavaScript文件。

如果实在要把二者进行比较,Webpack的处理速度更快更直接,能打包更多不同类型的文件。

开始使用Webpack

初步了解了Webpack工作方式后,我们一步步的开始学习使用Webpack。

安装

Webpack可以使用npm安装,新建一个空的练习文件夹(此处命名为webpack sample project),在终端中转到该文件夹后执行下述指令就可以完成安装。

//全局安装npm install -g webpack//安装到你的项目目录npm install --save-dev webpack

正式使用Webpack前的准备

在上述练习文件夹中创建一个package.json文件,这是一个标准的npm说明文件,里面蕴含了丰富的信息,包括当前项目的依赖模块,自定义的脚本任务等等。在终端中使用npm init命令可以自动创建这个package.json文件

npm init

输入这个命令后,终端会问你一系列诸如项目名称,项目描述,作者等信息,不过不用担心,如果你不准备在npm中发布你的模块,这些问题的答案都不重要,回车默认即可。

package.json文件已经就绪,我们在本项目中安装Webpack作为依赖包

// 安装Webpacknpm install --save-dev webpack

回到之前的空文件夹,并在里面创建两个文件夹,app文件夹和public文件夹,app文件夹用来存放原始数据和我们将写的JavaScript模块,public文件夹用来存放之后供浏览器读取的文件(包括使用webpack打包生成的js文件以及一个index.html文件)。接下来我们再创建三个文件:

index.html --放在public文件夹中;

Greeter.js-- 放在app文件夹中;

main.js-- 放在app文件夹中;

此时项目结构如下图所示

我们在index.html文件中写入最基础的html代码,它在这里目的在于引入打包后的js文件(这里我们先把之后打包后的js文件命名为bundle.js,之后我们还会详细讲述)。

Webpack Sample Projecttitle>head><body><divid='root'>div><scriptsrc="bundle.js">script>body>html></p> <p>我们在Greeter.js中定义一个返回包含问候信息的html元素的函数,并依据CommonJS规范导出这个函数为一个模块:</p> <p>// Greeter.jsmodule.exports = function() {  var greet = document.createElement('div');  greet.textContent = "Hi there and greetings!";  return greet;};</p> <p>main.js文件中我们写入下述代码,用以把Greeter模块返回的节点插入页面。</p> <p>//main.js const greeter = require('./Greeter.js');document.querySelector("#root").appendChild(greeter());</p> <p>正式使用Webpack</p> <p>webpack可以在终端中使用,在基本的使用方法如下:</p> <p># {extry file}出填写入口文件的路径,本文中就是上述main.js的路径,# {destination for bundled file}处填写打包文件的存放路径# 填写路径的时候不用添加{}webpack {entry file} {destination for bundled file}</p> <p>指定入口文件后,webpack将自动识别项目所依赖的其它文件,不过需要注意的是如果你的webpack不是全局安装的,那么当你在终端中使用此命令时,需要额外指定其在node_modules中的地址,继续上面的例子,在终端中输入如下命令</p> <p># webpack非全局安装的情况node_modules/.bin/webpack app/main.js public/bundle.js</p> <p>结果如下</p> <p>可以看出webpack同时编译了main.js 和Greeter,js,现在打开index.html,可以看到如下结果</p> <p>有没有很激动,已经成功的使用Webpack打包了一个文件了。不过在终端中进行复杂的操作,其实是不太方便且容易出错的,接下来看看Webpack的另一种更常见的使用方法。</p> <p>通过配置文件来使用Webpack</p> <p>Webpack拥有很多其它的比较高级的功能(比如说本文后面会介绍的loaders和plugins),这些功能其实都可以通过命令行模式实现,但是正如前面提到的,这样不太方便且容易出错的,更好的办法是定义一个配置文件,这个配置文件其实也是一个简单的JavaScript模块,我们可以把所有的与打包相关的信息放在里面。</p> <p>继续上面的例子来说明如何写这个配置文件,在当前练习文件夹的根目录下新建一个名为webpack.config.js的文件,我们在其中写入如下所示的简单配置代码,目前的配置主要涉及到的内容是入口文件路径和打包后文件的存放路径。</p> <p>module.exports = {  entry:  __dirname + "/app/main.js",//已多次提及的唯一入口文件  output: {    path: __dirname + "/public",//打包后的文件存放的地方    filename: "bundle.js"//打包后输出文件的文件名  }}</p> <p>注:“__dirname”是node.js中的一个全局变量,它指向当前执行脚本所在的目录。</p> <p>有了这个配置之后,再打包文件,只需在终端里运行webpack(非全局安装需使用node_modules/.bin/webpack)命令就可以了,这条命令会自动引用webpack.config.js文件中的配置选项,示例如下:</p> <p>又学会了一种使用Webpack的方法,这种方法不用管那烦人的命令行参数,有没有感觉很爽。如果我们可以连webpack(非全局安装需使用node_modules/.bin/webpack)这条命令都可以不用,那种感觉会不会更爽~,继续看下文。</p> <p>更快捷的执行打包任务</p> <p>在命令行中输入命令需要代码类似于node_modules/.bin/webpack这样的路径其实是比较烦人的,不过值得庆幸的是npm可以引导任务执行,对npm进行配置后可以在命令行中使用简单的npm start命令来替代上面略微繁琐的命令。在package.json中对scripts对象进行相关设置即可,设置方法如下。</p> <p>{  "name": "webpack-sample-project",  "version": "1.0.0",  "description": "Sample webpack project",  "scripts": {    "start": "webpack" // 修改的是这里,JSON文件不支持注释,引用时请清除  },  "author": "zhang",  "license": "ISC",  "devDependencies": {    "webpack": "3.10.0"  }}</p> <p>注:package.json中的script会安装一定顺序寻找命令对应位置,本地的node_modules/.bin路径就在这个寻找清单中,所以无论是全局还是局部安装的Webpack,你都不需要写前面那指明详细的路径了。</p> <p>npm的start命令是一个特殊的脚本名称,其特殊性表现在,在命令行中使用npm start就可以执行其对于的命令,如果对应的此脚本名称不是start,想要在命令行中运行时,需要这样用npm run {script name}如npm run build,我们在命令行中输入npm start试试,输出结果如下:</p> <p>现在只需要使用npm start就可以打包文件了,有没有觉得webpack也不过如此嘛,不过不要太小瞧webpack,要充分发挥其强大的功能我们需要修改配置文件的其它选项,一项项来看。</p> <p>Webpack的强大功能</p> <p>生成Source Maps(使调试更容易)</p> <p>开发总是离不开调试,方便的调试能极大的提高开发效率,不过有时候通过打包后的文件,你是不容易找到出错了的地方,对应的你写的代码的位置的,Source Maps就是来帮我们解决这个问题的。</p> <p>通过简单的配置,webpack就可以在打包时为我们生成的source maps,这为我们提供了一种对应编译文件和源文件的方法,使得编译后的代码可读性更高,也更容易调试。</p> <p>在webpack的配置文件中配置source maps,需要配置devtool,它有以下四种不同的配置选项,各具优缺点,描述如下:</p> <p>devtool选项</p> <p>配置结果</p> <p>source-map</p> <p>在一个单独的文件中产生一个完整且功能完全的文件。这个文件具有最好的source map,但是它会减慢打包速度;</p> <p>cheap-module-source-map</p> <p>在一个单独的文件中生成一个不带列映射的map,不带列映射提高了打包速度,但是也使得浏览器开发者工具只能对应到具体的行,不能对应到具体的列(符号),会对调试造成不便;</p> <p>eval-source-map</p> <p>使用eval打包源文件模块,在同一个文件中生成干净的完整的source map。这个选项可以在不影响构建速度的前提下生成完整的sourcemap,但是对打包后输出的JS文件的执行具有性能和安全的隐患。在开发阶段这是一个非常好的选项,在生产阶段则一定不要启用这个选项;</p> <p>cheap-module-eval-source-map</p> <p>这是在打包文件时最快的生成source map的方法,生成的Source Map 会和打包后的JavaScript文件同行显示,没有列映射,和eval-source-map选项具有相似的缺点;</p> <p>正如上表所述,上述选项由上到下打包速度越来越快,不过同时也具有越来越多的负面作用,较快的打包速度的后果就是对打包后的文件的的执行有一定影响。</p> <p>对小到中型的项目中,eval-source-map是一个很好的选项,再次强调你只应该开发阶段使用它,我们继续对上文新建的webpack.config.js,进行如下配置:</p> <p>module.exports = {  devtool: 'eval-source-map',  entry:  __dirname + "/app/main.js",  output: {    path: __dirname + "/public",    filename: "bundle.js"  }}</p> <p>cheap-module-eval-source-map方法构建速度更快,但是不利于调试,推荐在大型项目考虑时间成本时使用。</p> <p>使用webpack构建本地服务器</p> <p>想不想让你的浏览器监听你的代码的修改,并自动刷新显示修改后的结果,其实Webpack提供一个可选的本地开发服务器,这个本地服务器基于node.js构建,可以实现你想要的这些功能,不过它是一个单独的组件,在webpack中进行配置之前需要单独安装它作为项目依赖</p> <p>npm install --save-dev webpack-dev-server</p> <p>devserver作为webpack配置选项中的一项,以下是它的一些配置选项,更多配置可参考这里</p> <p>devserver的配置选项</p> <p>功能描述</p> <p>contentBase</p> <p>默认webpack-dev-server会为根文件夹提供本地服务器,如果想为另外一个目录下的文件提供本地服务器,应该在这里设置其所在目录(本例设置到“public"目录)</p> <p>port</p> <p>设置默认监听端口,如果省略,默认为”8080“</p> <p>inline</p> <p>设置为true,当源文件改变时会自动刷新页面</p> <p>historyApiFallback</p> <p>在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向index.html</p> <p>把这些命令加到webpack的配置文件中,现在的配置文件webpack.config.js如下所示</p> <p>module.exports = {  devtool: 'eval-source-map',  entry:  __dirname + "/app/main.js",  output: {    path: __dirname + "/public",    filename: "bundle.js"  },  devServer: {    contentBase: "./public",//本地服务器所加载的页面所在的目录    historyApiFallback: true,//不跳转    inline: true//实时刷新  } }</p> <p>在package.json中的scripts对象中添加如下命令,用以开启本地服务器:</p> <p>"scripts": {    "test": "echo \"Error: no test specified\" && exit 1",    "start": "webpack",    "server": "webpack-dev-server --open"  },</p> <p>在终端中输入npm run server即可在本地的8080端口查看结果</p> <p>Loaders</p> <p>鼎鼎大名的Loaders登场了!</p> <p>Loaders是webpack提供的最激动人心的功能之一了。通过使用不同的loader,webpack有能力调用外部的脚本或工具,实现对不同格式的文件的处理,比如说分析转换scss为css,或者把下一代的JS文件(ES6,ES7)转换为现代浏览器兼容的JS文件,对React的开发而言,合适的Loaders可以把React的中用到的JSX文件转换为JS文件。</p> <p>Loaders需要单独安装并且需要在webpack.config.js中的modules关键字下进行配置,Loaders的配置包括以下几方面:</p> <p>test:一个用以匹配loaders所处理文件的拓展名的正则表达式(必须)</p> <p>loader:loader的名称(必须)</p> <p>include/exclude:手动添加必须处理的文件(文件夹)或屏蔽不需要处理的文件(文件夹)(可选);</p> <p>query:为loaders提供额外的设置选项(可选)</p> <p>不过在配置loader之前,我们把Greeter.js里的问候消息放在一个单独的JSON文件里,并通过合适的配置使Greeter.js可以读取该JSON文件的值,各文件修改后的代码如下:</p> <p>在app文件夹中创建带有问候信息的JSON文件(命名为config.json)</p> <p>{  "greetText": "Hi there and greetings from JSON!"}</p> <p>更新后的Greeter.js</p> <p>var config = require('./config.json');module.exports = function() {  var greet = document.createElement('div');  greet.textContent = config.greetText;  return greet;};</p> <p>注 由于webpack3.*/webpack2.*已经内置可处理JSON文件,这里我们无需再添加webpack1.*需要的json-loader。在看如何具体使用loader之前我们先看看Babel是什么?</p> <p>Babel</p> <p>Babel其实是一个编译JavaScript的平台,它可以编译代码帮你达到以下目的:</p> <p>让你能使用最新的JavaScript代码(ES6,ES7...),而不用管新标准是否被当前使用的浏览器完全支持;</p> <p>让你能使用基于JavaScript进行了拓展的语言,比如React的JSX;</p> <p>Babel的安装与配置</p> <p>Babel其实是几个模块化的包,其核心功能位于称为babel-core的npm包中,webpack可以把其不同的包整合在一起使用,对于每一个你需要的功能或拓展,你都需要安装单独的包(用得最多的是解析Es6的babel-env-preset包和解析JSX的babel-preset-react包)。</p> <p>我们先来一次性安装这些依赖包</p> <p>// npm一次性安装多个依赖模块,模块之间用空格隔开npm install --save-dev babel-core babel-loader babel-preset-env babel-preset-react</p> <p>在webpack中配置Babel的方法如下:</p> <p>module.exports = {    entry: __dirname + "/app/main.js",//已多次提及的唯一入口文件    output: {        path: __dirname + "/public",//打包后的文件存放的地方        filename: "bundle.js"//打包后输出文件的文件名    },    devtool: 'eval-source-map',    devServer: {        contentBase: "./public",//本地服务器所加载的页面所在的目录        historyApiFallback: true,//不跳转        inline: true//实时刷新    },    module: {        rules: [            {                test: /(\.jsx|\.js)$/,                use: {                    loader: "babel-loader",                    options: {                        presets: [                            "env", "react"                        ]                    }                },                exclude: /node_modules/            }        ]    }};</p> <p>现在你的webpack的配置已经允许你使用ES6以及JSX的语法了。继续用上面的例子进行测试,不过这次我们会使用React,记得先安装 React 和 React-DOM</p> <p>npm install --save react react-dom</p> <p>接下来我们使用ES6的语法,更新Greeter.js并返回一个React组件</p> <p>//Greeter,jsimport React, {Component} from'react'import config from'./config.json';classGreeterextendsComponent{  render() {    return (      <div>        {config.greetText}      div>    );  }}exportdefault Greeter</p> <p>修改main.js如下,使用ES6的模块定义和渲染Greeter模块</p> <p>// main.jsimport React from'react';import {render} from'react-dom';import Greeter from'./Greeter';render(<Greeter />, document.getElementById('root'));</p> <p>重新使用npm start打包,如果之前打开的本地服务器没有关闭,你应该可以在localhost:8080下看到与之前一样的内容,这说明react和es6被正常打包了。</p> <p>Babel的配置</p> <p>Babel其实可以完全在 webpack.config.js 中进行配置,但是考虑到babel具有非常多的配置选项,在单一的webpack.config.js文件中进行配置往往使得这个文件显得太复杂,因此一些开发者支持把babel的配置选项放在一个单独的名为 ".babelrc" 的配置文件中。我们现在的babel的配置并不算复杂,不过之后我们会再加一些东西,因此现在我们就提取出相关部分,分两个配置文件进行配置(webpack会自动调用.babelrc里的babel配置选项),如下:</p> <p>module.exports = {    entry: __dirname + "/app/main.js",//已多次提及的唯一入口文件    output: {        path: __dirname + "/public",//打包后的文件存放的地方        filename: "bundle.js"//打包后输出文件的文件名    },    devtool: 'eval-source-map',    devServer: {        contentBase: "./public",//本地服务器所加载的页面所在的目录        historyApiFallback: true,//不跳转        inline: true//实时刷新    },    module: {        rules: [            {                test: /(\.jsx|\.js)$/,                use: {                    loader: "babel-loader"                },                exclude: /node_modules/            }        ]    }};</p> <p>//.babelrc{  "presets": ["react", "env"]}</p> <p>到目前为止,我们已经知道了,对于模块,Webpack能提供非常强大的处理功能,那那些是模块呢。</p> <p>一切皆模块</p> <p>Webpack有一个不可不说的优点,它把所有的文件都都当做模块处理,JavaScript代码,CSS和fonts以及图片等等通过合适的loader都可以被处理。</p> <p>CSS</p> <p>webpack提供两个工具处理样式表,css-loader 和 style-loader,二者处理的任务不同,css-loader使你能够使用类似@import 和 url(...)的方法实现 require()的功能,style-loader将所有的计算后的样式加入页面中,二者组合在一起使你能够把样式表嵌入webpack打包后的JS文件中。</p> <p>继续上面的例子</p> <p>//安装npm install --save-dev style-loader css-loader</p> <p>//使用module.exports = {  ...    module: {        rules: [            {                test: /(\.jsx|\.js)$/,                use: {                    loader: "babel-loader"                },                exclude: /node_modules/            },            {                test: /\.css$/,                use: [                    {                        loader: "style-loader"                    }, {                        loader: "css-loader"                    }                ]            }        ]    }};</p> <p>请注意这里对同一个文件引入多个loader的方法。</p> <p>接下来,在app文件夹里创建一个名字为"main.css"的文件,对一些元素设置样式</p> <p>/* main.css */html {  box-sizing: border-box;  -ms-text-size-adjust: 100%;  -webkit-text-size-adjust: 100%;}*, *:before, *:after {  box-sizing: inherit;}body {  margin: 0;  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;}h1, h2, h3, h4, h5, h6, p, ul {  margin: 0;  padding: 0;}</p> <p>我们这里例子中用到的webpack只有单一的入口,其它的模块需要通过 import, require, url等与入口文件建立其关联,为了让webpack能找到”main.css“文件,我们把它导入”main.js “中,如下</p> <p>//main.jsimport React from'react';import {render} from'react-dom';import Greeter from'./Greeter';import'./main.css';//使用require导入css文件render(<Greeter />, document.getElementById('root'));</p> <p>通常情况下,css会和js打包到同一个文件中,并不会打包为一个单独的css文件,不过通过合适的配置webpack也可以把css打包为单独的文件的。</p> <p>上面的代码说明webpack是怎么把css当做模块看待的,咱们继续看一个更加真实的css模块实践。</p> <p>CSS module</p> <p>在过去的一些年里,JavaScript通过一些新的语言特性,更好的工具以及更好的实践方法(比如说模块化)发展得非常迅速。模块使得开发者把复杂的代码转化为小的,干净的,依赖声明明确的单元,配合优化工具,依赖管理和加载管理可以自动完成。</p> <p>不过前端的另外一部分,CSS发展就相对慢一些,大多的样式表却依旧巨大且充满了全局类名,维护和修改都非常困难。</p> <p>被称为CSS modules的技术意在把JS的模块化思想带入CSS中来,通过CSS模块,所有的类名,动画名默认都只作用于当前模块。Webpack对CSS模块化提供了非常好的支持,只需要在CSS loader中进行简单配置即可,然后就可以直接把CSS的类名传递到组件的代码中,这样做有效避免了全局污染。具体的代码如下</p> <p>module.exports = {    ...    module: {        rules: [            {                test: /(\.jsx|\.js)$/,                use: {                    loader: "babel-loader"                },                exclude: /node_modules/            },            {                test: /\.css$/,                use: [                    {                        loader: "style-loader"                    }, {                        loader: "css-loader",                        options: {                            modules: true, // 指定启用css modules                            localIdentName: '[name]__[local]--[hash:base64:5]'// 指定css的类名格式                        }                    }                ]            }        ]    }};</p> <p>我们在app文件夹下创建一个Greeter.css文件来进行一下测试</p> <p>/* Greeter.css */.root {  background-color: #eee;  padding: 10px;  border: 3px solid #ccc;}</p> <p>导入.root到Greeter.js中</p> <p>import React, {Component} from'react';import config from'./config.json';import styles from'./Greeter.css';//导入classGreeterextendsComponent{  render() {    return (      <divclassName={styles.root}> //使用cssModule添加类名的方法        {config.greetText}      div>    );  }}exportdefault Greeter</p> <p>放心使用把,相同的类名也不会造成不同组件之间的污染。</p> <p>CSS modules 也是一个很大的主题,有兴趣的话可以去其官方文档了解更多。</p> <p>CSS预处理器</p> <p>Sass 和 Less 之类的预处理器是对原生CSS的拓展,它们允许你使用类似于variables, nesting, mixins, inheritance等不存在于CSS中的特性来写CSS,CSS预处理器可以这些特殊类型的语句转化为浏览器可识别的CSS语句,</p> <p>你现在可能都已经熟悉了,在webpack里使用相关loaders进行配置就可以使用了,以下是常用的CSS 处理loaders:</p> <p>Less Loader</p> <p>Sass Loader</p> <p>Stylus Loader</p> <p>不过其实也存在一个CSS的处理平台-PostCSS,它可以帮助你的CSS实现更多的功能,在其官方文档可了解更多相关知识。</p> <p>举例来说如何使用PostCSS,我们使用PostCSS来为CSS代码自动添加适应不同浏览器的CSS前缀。</p> <p>首先安装postcss-loader 和 autoprefixer(自动添加前缀的插件)</p> <p>npm install--save-dev postcss-loader autoprefixer</p> <p>接下来,在webpack配置文件中添加postcss-loader,在根目录新建postcss.config.js,并添加如下代码之后,重新使用npm start打包时,你写的css会自动根据Can i use里的数据添加不同前缀了。</p> <p>//webpack.config.jsmodule.exports = {    ...    module: {        rules: [            {                test: /(\.jsx|\.js)$/,                use: {                    loader: "babel-loader"                },                exclude: /node_modules/            },            {                test: /\.css$/,                use: [                    {                        loader: "style-loader"                    }, {                        loader: "css-loader",                        options: {                            modules: true                        }                    }, {                        loader: "postcss-loader"                    }                ]            }        ]    }}</p> <p>// postcss.config.jsmodule.exports = {    plugins: [        require('autoprefixer')    ]}</p> <p>至此,本文已经谈论了处理JS的Babel和处理CSS的PostCSS的基本用法,它们其实也是两个单独的平台,配合webpack可以很好的发挥它们的作用。接下来介绍Webpack中另一个非常重要的功能-Plugins</p> <p>插件(Plugins)</p> <p>插件(Plugins)是用来拓展Webpack功能的,它们会在整个构建过程中生效,执行相关的任务。</p> <p>Loaders和Plugins常常被弄混,但是他们其实是完全不同的东西,可以这么来说,loaders是在打包构建过程中用来处理源文件的(JSX,Scss,Less..),一次处理一个,插件并不直接操作单个文件,它直接对整个构建过程其作用。</p> <p>Webpack有很多内置插件,同时也有很多第三方插件,可以让我们完成更加丰富的功能。</p> <p>使用插件的方法</p> <p>要使用某个插件,我们需要通过npm安装它,然后要做的就是在webpack配置中的plugins关键字部分添加该插件的一个实例(plugins是一个数组)继续上面的例子,我们添加了一个给打包后代码添加版权声明的插件。</p> <p>const webpack = require('webpack');module.exports = {...    module: {        rules: [            {                test: /(\.jsx|\.js)$/,                use: {                    loader: "babel-loader"                },                exclude: /node_modules/            },            {                test: /\.css$/,                use: [                    {                        loader: "style-loader"                    }, {                        loader: "css-loader",                        options: {                            modules: true                        }                    }, {                        loader: "postcss-loader"                    }                ]            }        ]    },    plugins: [        new webpack.BannerPlugin('版权所有,翻版必究')    ],};</p> <p>通过这个插件,打包后的JS文件显示如下</p> <p>这就是webpack插件的基础用法了,下面给大家推荐几个常用的插件</p> <p>HtmlWebpackPlugin</p> <p>这个插件的作用是依据一个简单的index.html模板,生成一个自动引用你打包后的JS文件的新index.html。这在每次生成的js文件名称不同时非常有用(比如添加了hash值)。</p> <p>安装</p> <p>npm install --save-dev html-webpack-plugin</p> <p>这个插件自动完成了我们之前手动做的一些事情,在正式使用之前需要对一直以来的项目结构做一些更改:</p> <p>移除public文件夹,利用此插件,index.html文件会自动生成,此外CSS已经通过前面的操作打包到JS中了。</p> <p>在app目录下,创建一个index.tmpl.html文件模板,这个模板包含title等必须元素,在编译过程中,插件会依据此模板生成最终的html页面,会自动添加所依赖的 css, js,favicon等文件,index.tmpl.html中的模板源代码如下:</p> <p><htmllang="en"><head><metacharset="utf-8"><title>Webpack Sample Projecttitle>head><body><divid='root'>div>body>html></p> <p>3.更新webpack的配置文件,方法同上,新建一个build文件夹用来存放最终的输出文件</p> <p>const webpack = require('webpack');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {    entry: __dirname + "/app/main.js",//已多次提及的唯一入口文件    output: {        path: __dirname + "/build",        filename: "bundle.js"    },    devtool: 'eval-source-map',    devServer: {        contentBase: "./public",//本地服务器所加载的页面所在的目录        historyApiFallback: true,//不跳转        inline: true//实时刷新    },    module: {        rules: [            {                test: /(\.jsx|\.js)$/,                use: {                    loader: "babel-loader"                },                exclude: /node_modules/            },            {                test: /\.css$/,                use: [                    {                        loader: "style-loader"                    }, {                        loader: "css-loader",                        options: {                            modules: true                        }                    }, {                        loader: "postcss-loader"                    }                ]            }        ]    },    plugins: [        new webpack.BannerPlugin('版权所有,翻版必究'),        new HtmlWebpackPlugin({            template: __dirname + "/app/index.tmpl.html"//new 一个这个插件的实例,并传入相关的参数        })    ],};</p> <p>再次执行npm start你会发现,build文件夹下面生成了bundle.js和index.html。</p> <p>Hot Module Replacement</p> <p>Hot Module Replacement(HMR)也是webpack里很有用的一个插件,它允许你在修改组件代码后,自动刷新实时预览修改后的效果。</p> <p>在webpack中实现HMR也很简单,只需要做两项配置</p> <p>在webpack配置文件中添加HMR插件;</p> <p>在Webpack Dev Server中添加“hot”参数;</p> <p>不过配置完这些后,JS模块其实还是不能自动热加载的,还需要在你的JS模块中执行一个Webpack提供的API才能实现热加载,虽然这个API不难使用,但是如果是React模块,使用我们已经熟悉的Babel可以更方便的实现功能热加载。</p> <p>整理下我们的思路,具体实现方法如下</p> <p>Babel和webpack是独立的工具</p> <p>二者可以一起工作</p> <p>二者都可以通过插件拓展功能</p> <p>HMR是一个webpack插件,它让你能浏览器中实时观察模块修改后的效果,但是如果你想让它工作,需要对模块进行额外的配额;</p> <p>Babel有一个叫做react-transform-hrm的插件,可以在不对React模块进行额外的配置的前提下让HMR正常工作;</p> <p>还是继续上例来实际看看如何配置</p> <p>const webpack = require('webpack');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {    entry: __dirname + "/app/main.js",//已多次提及的唯一入口文件    output: {        path: __dirname + "/build",        filename: "bundle.js"    },    devtool: 'eval-source-map',    devServer: {        contentBase: "./public",//本地服务器所加载的页面所在的目录        historyApiFallback: true,//不跳转        inline: true,        hot: true    },    module: {        rules: [            {                test: /(\.jsx|\.js)$/,                use: {                    loader: "babel-loader"                },                exclude: /node_modules/            },            {                test: /\.css$/,                use: [                    {                        loader: "style-loader"                    }, {                        loader: "css-loader",                        options: {                            modules: true                        }                    }, {                        loader: "postcss-loader"                    }                ]            }        ]    },    plugins: [        new webpack.BannerPlugin('版权所有,翻版必究'),        new HtmlWebpackPlugin({            template: __dirname + "/app/index.tmpl.html"//new 一个这个插件的实例,并传入相关的参数        }),        new webpack.HotModuleReplacementPlugin()//热加载插件    ],};  </p> <p>安装react-transform-hmr</p> <p>npm install --save-dev babel-plugin-react-transform react-transform-hmr</p> <p>配置Babel</p> <p>// .babelrc{  "presets": ["react", "env"],  "env": {    "development": {    "plugins": [["react-transform", {      "transforms": [{        "transform": "react-transform-hmr",                  "imports": ["react"],                  "locals": ["module"]      }]    }]]    }  }}</p> <p>现在当你使用React时,可以热加载模块了,每次保存就能在浏览器上看到更新内容。</p> <p>产品阶段的构建</p> <p>目前为止,我们已经使用webpack构建了一个完整的开发环境。但是在产品阶段,可能还需要对打包的文件进行额外的处理,比如说优化,压缩,缓存以及分离CSS和JS。</p> <p>对于复杂的项目来说,需要复杂的配置,这时候分解配置文件为多个小的文件可以使得事情井井有条,以上面的例子来说,我们创建一个webpack.production.config.js的文件,在里面加上基本的配置,它和原始的webpack.config.js很像,如下</p> <p>// webpack.production.config.jsconst webpack = require('webpack');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {    entry: __dirname + "/app/main.js", //已多次提及的唯一入口文件    output: {        path: __dirname + "/build",        filename: "bundle.js"    },    devtool: 'null', //注意修改了这里,这能大大压缩我们的打包代码    devServer: {        contentBase: "./public", //本地服务器所加载的页面所在的目录        historyApiFallback: true, //不跳转        inline: true,        hot: true    },    module: {        rules: [{            test: /(\.jsx|\.js)$/,            use: {                loader: "babel-loader"            },            exclude: /node_modules/        }, {            test: /\.css$/,            use: ExtractTextPlugin.extract({                fallback: "style-loader",                use: [{                    loader: "css-loader",                    options: {                        modules: true                    }                }, {                    loader: "postcss-loader"                }],            })        }]    },    plugins: [        new webpack.BannerPlugin('版权所有,翻版必究'),        new HtmlWebpackPlugin({            template: __dirname + "/app/index.tmpl.html"//new 一个这个插件的实例,并传入相关的参数        }),        new webpack.HotModuleReplacementPlugin() //热加载插件    ],};</p> <p>//package.json{  "name": "test",  "version": "1.0.0",  "description": "",  "main": "index.js",  "scripts": {    "test": "echo \"Error: no test specified\" && exit 1",    "start": "webpack",    "server": "webpack-dev-server --open",    "build": "NODE_ENV=production webpack --config ./webpack.production.config.js --progress"  },  "author": "",  "license": "ISC",  "devDependencies": {...  },  "dependencies": {    "react": "^15.6.1",    "react-dom": "^15.6.1"  }}</p> <p>注意:如果是window电脑,build需要配置为"build": "set NODE_ENV=production && webpack --config ./webpack.production.config.js --progress".谢谢评论区简友提醒。</p> <p>优化插件</p> <p>webpack提供了一些在发布阶段非常有用的优化插件,它们大多来自于webpack社区,可以通过npm安装,通过以下插件可以完成产品发布阶段所需的功能</p> <p>OccurenceOrderPlugin :为组件分配ID,通过这个插件webpack可以分析和优先考虑使用最多的模块,并为它们分配最小的ID</p> <p>UglifyJsPlugin:压缩JS代码;</p> <p>ExtractTextPlugin:分离CSS和JS文件</p> <p>我们继续用例子来看看如何添加它们,OccurenceOrder 和 UglifyJS plugins 都是内置插件,你需要做的只是安装其它非内置插件</p> <p>npm install --save-dev extract-text-webpack-plugin</p> <p>在配置文件的plugins后引用它们</p> <p>// webpack.production.config.jsconst webpack = require('webpack');const HtmlWebpackPlugin = require('html-webpack-plugin');const ExtractTextPlugin = require('extract-text-webpack-plugin');module.exports = {    entry: __dirname + "/app/main.js",//已多次提及的唯一入口文件    output: {        path: __dirname + "/build",        filename: "bundle.js"    },    devtool: 'none',    devServer: {        contentBase: "./public",//本地服务器所加载的页面所在的目录        historyApiFallback: true,//不跳转        inline: true,        hot: true    },    module: {        rules: [            {                test: /(\.jsx|\.js)$/,                use: {                    loader: "babel-loader"                },                exclude: /node_modules/            },            {                test: /\.css$/,                use: [                    {                        loader: "style-loader"                    }, {                        loader: "css-loader",                        options: {                            modules: true                        }                    }, {                        loader: "postcss-loader"                    }                ]            }        ]    },    plugins: [        new webpack.BannerPlugin('版权所有,翻版必究'),        new HtmlWebpackPlugin({            template: __dirname + "/app/index.tmpl.html"        }),        new webpack.optimize.OccurrenceOrderPlugin(),        new webpack.optimize.UglifyJsPlugin(),        new ExtractTextPlugin("style.css")    ],};</p> <p>此时执行npm run build可以看见代码是被压缩后的</p> <p>缓存</p> <p>缓存无处不在,使用缓存的最好方法是保证你的文件名和文件内容是匹配的(内容改变,名称相应改变)</p> <p>webpack可以把一个哈希值添加到打包的文件名中,使用方法如下,添加特殊的字符串混合体([name], [id] and [hash])到输出文件名前</p> <p>const webpack = require('webpack');const HtmlWebpackPlugin = require('html-webpack-plugin');const ExtractTextPlugin = require('extract-text-webpack-plugin');module.exports = {..    output: {        path: __dirname + "/build",        filename: "bundle-[hash].js"    },  ...};</p> <p>现在用户会有合理的缓存了。</p> <p>去除build文件中的残余文件</p> <p>添加了hash之后,会导致改变文件内容后重新打包时,文件名不同而内容越来越多,因此这里介绍另外一个很好用的插件clean-webpack-plugin。</p> <p>安装:</p> <p>cnpm install clean-webpack-plugin --save-dev</p> <p>使用:</p> <p>引入clean-webpack-plugin插件后在配置文件的plugins中做相应配置即可:</p> <p>const CleanWebpackPlugin = require("clean-webpack-plugin");  plugins: [    ...// 这里是之前配置的其它各种插件new CleanWebpackPlugin('build/*.*', {      root: __dirname,      verbose: true,      dry: false  })  ]</p> <p>关于clean-webpack-plugin的详细使用可参考这里</p> <p>总结</p> <p>其实这是一年前的文章了,趁周末重新运行和修改了一下,现在所有的代码都可以正常运行,所用webpack基于最新的webpack3.5.3。希望依旧能对你有帮助。</p> <p>这是一篇好长的文章,谢谢你的耐心,能仔细看到了这里,大概半个月前我第一次自己一步步配置项目所需的Webpack后就一直想写一篇笔记做总结,几次动笔都不能让自己满意,总觉得写不清楚。其实关于Webpack本文讲述得仍不完全,不过相信你看完后已经进入Webpack的大门,能够更好的探索其它的关于Webpack的知识了。</p> <p>欢迎大家在文后发表自己的观点讨论。</p> <p>更新说明</p> <p>2017-12-11更新,修改css module部分代码及示例图片,css module真的非常好用,希望大家都能用上。</p> <p>2017年9月18日更新,添加了一个使用webpack配置多页应用的demo,可以点击此处查看</p> <p>2017年8月13日更新,本文依据webpack3.5.3将文章涉及代码完全重写,所有代码都在Mac上正常运行过。希望依旧对你学习webpack有帮助。</p> <p>2017年8月16号更新:</p> <p>最近在Gitchat上将发起了一场关于webpack的分享,目的在于一起花最短的时间理解和学会webpack,感兴趣的童鞋可以微信扫描注册哈。</p> </article> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1671320744560254976"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(webpack入门笔记)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950141538352820224.htm" title="2025.07 Java入门笔记01" target="_blank">2025.07 Java入门笔记01</a> <span class="text-muted">殷浩焕</span> <a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>一、熟悉IDEA和Java语法(一)LiuCourseJavaOOP1.一直在用C++开发,python也用了些,Java是真的不熟,用什么IDE还是问的同事;2.一开始安装了jdk-23,拿VSCode当编辑器,在cmd窗口编译运行,也能玩;但是想正儿八经搞项目开发,还是需要IDE;3.安装了IDEA社区版:(1)IDE通常自带对应编程语言的安装包,例如IDEA自带jbr-21(和jdk是不同的</div> </li> <li><a href="/article/1950060071656419328.htm" title="webpack 浅谈系列之 Loader" target="_blank">webpack 浅谈系列之 Loader</a> <span class="text-muted">KimYYX</span> <div>webpack拥有六大核心部分:Entry、Output、Loaders、Plugins、Mode、BrowserCompatibility,这里就我的理解来稍微聊聊Loaders这个部分。1.认识Loader先放出我对loader的理解:Loader是用来逐个处理指定类型的文件。emmm...下面我们对上面那句话稍微解释下。首先我们要先明确,一个Loader是如何在webpack中配置的,见下面</div> </li> <li><a href="/article/1950039673418084352.htm" title="解决 Webpack 报错 “No module factory available for dependency type: CssDependency“ 的方法" target="_blank">解决 Webpack 报错 “No module factory available for dependency type: CssDependency“ 的方法</a> <span class="text-muted">cmmav33990</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/rust/1.htm">rust</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>这个错误表明Webpack在处理CSS依赖时找不到合适的模块工厂,通常发生在配置不完整或依赖冲突的情况下。以下是详细的解决方案:核心解决方案方案1:安装并配置正确的CSS处理器(最推荐)bashnpminstall--save-devcss-loaderstyle-loader#或使用mini-css-extract-plugin替代style-loadernpminstall--save-dev</div> </li> <li><a href="/article/1949932110080962560.htm" title="webpack 配置 style-loader时出现错误:Module build failed (from ../node_modules/style-loader/dist/cjs.js)" target="_blank">webpack 配置 style-loader时出现错误:Module build failed (from ../node_modules/style-loader/dist/cjs.js)</a> <span class="text-muted">.ToString()°</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/es6%2Fes7/1.htm">es6/es7</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>webpack配置style-loader时出现错误,Modulebuildfailed(from…/node_modules/style-loader/dist/cjs.js):TypeError:this.getOptionsisnotafunctionatObject.loader1.确保loader配置中的顺序,loader的执行顺序是从右到左,从下到上的,这里要注意style-loade</div> </li> <li><a href="/article/1949892598973919232.htm" title="webpack实用教程" target="_blank">webpack实用教程</a> <span class="text-muted">前端的爬行之旅</span> <div>packjson.js终端输入$npminit-y{"name":"2","version":"1.0.0","description":"","main":"webpack.config.js","scripts":{"test":"echo\"Error:notestspecified\"&&exit1",},"keywords":[],"author":"","license":"ISC",</div> </li> <li><a href="/article/1949218072862715904.htm" title="PostgreSQL入门笔记250718" target="_blank">PostgreSQL入门笔记250718</a> <span class="text-muted">kfepiza</span> <a class="tag" taget="_blank" href="/search/Database%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">Database数据库</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E5%85%B3%E7%B3%BB%E5%9E%8B/1.htm">关系型</a><a class="tag" taget="_blank" href="/search/%E9%9D%9E%E5%85%B3%E7%B3%BB%E5%9E%8B/1.htm">非关系型</a><a class="tag" taget="_blank" href="/search/nosql/1.htm">nosql</a><a class="tag" taget="_blank" href="/search/postgresql/1.htm">postgresql</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>PostgreSQL入门笔记250718PostgreSQL介绍PostgreSQL(简称Postgres)是一款功能极其强大且开源的对象-关系型数据库管理系统(ORDBMS)。它以可靠性、功能丰富、性能卓越和扩展性而闻名,是许多关键业务应用、地理信息系统(GIS)、数据分析平台等的首选数据库。以下是对PostgreSQL的详细解析:核心特性与优势开源与自由:遵循PostgreSQL许可证(类似B</div> </li> <li><a href="/article/1948724729120616448.htm" title="electron如何使用webpack打包webview标签中的preload文件" target="_blank">electron如何使用webpack打包webview标签中的preload文件</a> <span class="text-muted">Stud_movingj</span> <a class="tag" taget="_blank" href="/search/%E8%AE%B0%E5%BD%95/1.htm">记录</a><a class="tag" taget="_blank" href="/search/%E5%BF%83%E5%BE%97/1.htm">心得</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a> <div>注意:本文基于使用vueaddelectron-builder搭建的项目(在vue2项目上运行vueaddelectron-builder命令搭建而成)并在electron12及13测试过在webview中开发者可以使用preload预加载并执行js文件官方文档网上以及官方的很多例子都是传入一个相对路径的String,并没有以file://开头。然而我这里只能传入String字符串并且是file协</div> </li> <li><a href="/article/1948563243580583936.htm" title="webpack原理" target="_blank">webpack原理</a> <span class="text-muted">浮游本尊</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%8E%9F%E5%9E%8B%E6%A8%A1%E5%BC%8F/1.htm">原型模式</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>JavaScript的模块打包工具(modulebundler)。通过分析模块之间的依赖,最终将所有模块打包成一份或者多份代码包(bundler),供HTML直接引用。实质上,Webpack仅仅提供了打包功能和一套文件处理机制,然后通过生态中的各种Loader和Plugin对代码进行预编译和打包。因此Webpack具有高度的可拓展性,能更好的发挥社区生态的力量。Entry:入口文件,Webpack</div> </li> <li><a href="/article/1948561350141734912.htm" title="npm build报错Cannot find module ‘webpack/lib/rules/BasicEffectRulePlugin‘解决方法" target="_blank">npm build报错Cannot find module ‘webpack/lib/rules/BasicEffectRulePlugin‘解决方法</a> <span class="text-muted">奔跑吧邓邓子</span> <a class="tag" taget="_blank" href="/search/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94%EF%BC%88FAQ%EF%BC%89/1.htm">常见问题解答(FAQ)</a><a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a> <div>提示:“奔跑吧邓邓子”的常见问题专栏聚焦于各类技术领域常见问题的解答。涵盖操作系统(如CentOS、Linux等)、开发工具(如AndroidStudio)、服务器软件(如Zabbix、JumpServer、RocketMQ等)以及远程桌面、代码克隆等多种场景。针对如远程桌面无法复制粘贴、Kubernetes报错、自启动报错、各类软件安装报错、内存占用问题、网络连接问题等提供了详细的问题描述与有效</div> </li> <li><a href="/article/1948560468461285376.htm" title="vue3 + vite || Vue3 + Webpack创建项目" target="_blank">vue3 + vite || Vue3 + Webpack创建项目</a> <span class="text-muted">qq_41521625</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>1.vue3+vite搭建项目方法(需要提前装node,js)1.使用官方create-vite工具(推荐)1.使用npm-----------------------------npmcreatevue@latest2.使用pnpm-----------------------------pnpmcreatevue@latest3.使用yarn--------------------------</div> </li> <li><a href="/article/1948558450229309440.htm" title="webpack打包原理" target="_blank">webpack打包原理</a> <span class="text-muted">小孟学长</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a> <div>一、什么是webpackwebpack是一个模块打包机,将根据文件间的依赖关系对其进行静态分析。然后将这些模块按指定规则生成静态资源。当webpack处理程序时,他会递归地构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bundle。主要承担如下功能打包:将多个文件打包成一个文件,减少服务器压力和下载贷款。转换:将与编译语言转换成浏览器识别的语言优化:性能优化</div> </li> <li><a href="/article/1948319038425853952.htm" title="npm run build 前端生成生产环境代码的核心命令" target="_blank">npm run build 前端生成生产环境代码的核心命令</a> <span class="text-muted">一蓑烟雨6668</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>npmrunbuild是前端项目中用于生成生产环境代码的核心命令,它通过执行package.json中定义的构建脚本,将源代码转换为优化、压缩的静态文件。以下是详细使用指南:⚙️一、基本概念与配置方法命令解析npmrunbuild实际执行的是package.json文件中scripts对象下的build字段定义的命令。例如:{"scripts":{"build":"webpack--modepro</div> </li> <li><a href="/article/1948224751398875136.htm" title="[webpack-cli] TypeError: compiler.getInfrastructureLogger is not a function【webpack与webpack-cli不兼容】" target="_blank">[webpack-cli] TypeError: compiler.getInfrastructureLogger is not a function【webpack与webpack-cli不兼容】</a> <span class="text-muted">iku_ki</span> <a class="tag" taget="_blank" href="/search/bug/1.htm">bug</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AFvue/1.htm">前端vue</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a> <div>首先将之前的安装的版本删除npmuninstallwebpackwebpack-cli-g//这是全局删除重新指定版本下载:npminstallwebpack@4.16.5webpack-cli@3.3.11-g</div> </li> <li><a href="/article/1948058464680996864.htm" title="Vue3 业务落地全景:脚手架、权限、国际化、微前端、跨端与低代码 50 条实战心法" target="_blank">Vue3 业务落地全景:脚手架、权限、国际化、微前端、跨端与低代码 50 条实战心法</a> <span class="text-muted">代码老y</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E4%BD%8E%E4%BB%A3%E7%A0%81/1.htm">低代码</a> <div>写给架构师、TL、全栈工程师的“踩坑地图”(零)阅读指南•不贴源码,用伪代码+流程图+决策树。•50条心法分6大篇章,可跳跃阅读。(一)脚手架与工程化8条心法1:用create-vue而不是vue-cli开启新项目,Vite冷启动300msvsWebpack30s。心法2:eslint-config-prettier+@vue/eslint-config-typescript一键集成,团队争议减少</div> </li> <li><a href="/article/1947763002170208256.htm" title="vue中实现验证码输入" target="_blank">vue中实现验证码输入</a> <span class="text-muted">结城</span> <a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/%E9%AA%8C%E8%AF%81%E7%A0%81/1.htm">验证码</a><a class="tag" taget="_blank" href="/search/vue%E8%BE%93%E5%85%A5%E6%A1%86/1.htm">vue输入框</a> <div>vue验证码input输入解决焦点切换有点晚了就不吐槽了,咱还是把代码上了,赶紧洗澡,养好精神明天努力上班!!!想学node,想学react,想精进webpack,想vue学的更好一点,了解底层代码,学算法,学计算机原理,想写自己的博客网站…这是一条学无止境的路,没办法要恰饭效果html部分js部分exportdefault{props:{inputNums:{type:Number,defaul</div> </li> <li><a href="/article/1947554259331510272.htm" title="Vite:下一代前端构建工具的革命" target="_blank">Vite:下一代前端构建工具的革命</a> <span class="text-muted">布兰妮甜</span> <a class="tag" taget="_blank" href="/search/vite/1.htm">vite</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7/1.htm">构建工具</a> <div>Hi,我是布兰妮甜!在现代前端开发领域,构建工具的选择对开发体验和项目效率有着决定性影响。从早期的Grunt、Gulp到Webpack、Rollup,前端构建工具不断演进。而Vite的出现,则彻底改变了传统构建工具的工作模式,为开发者带来了前所未有的开发体验。本文将深入探讨Vite的设计哲学、核心特性、工作原理以及实际应用场景。文章目录一、什么是Vite?二、Vite的核心设计理念2.1利用浏览器</div> </li> <li><a href="/article/1947464728292945920.htm" title="Python Preview 项目教程" target="_blank">Python Preview 项目教程</a> <span class="text-muted"></span> <div>PythonPreview项目教程1.项目的目录结构及介绍python-preview/├──images/├──.eslintrc.json├──.gitignore├──.vscodeignore├──CHANGELOG.md├──README.md├──package.json├──tsconfig.json└──webpack.config.jsimages/:存放项目相关的图片文件。.e</div> </li> <li><a href="/article/1947394631700377600.htm" title="Template execution failed: ReferenceError: name is not defined" target="_blank">Template execution failed: ReferenceError: name is not defined</a> <span class="text-muted">An_s</span> <a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF%EF%BC%88javascript%EF%BC%89/1.htm">技术(javascript)</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE%EF%BC%88%E7%8E%AF%E5%A2%83%EF%BC%89/1.htm">配置(环境)</a><a class="tag" taget="_blank" href="/search/reactjs/1.htm">reactjs</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a> <div>问题我们使用了html-webpack-plugin(webpack)进行编译html,导致的错误。排查结果连接地址html-webpack-plugin版本低(2.30.1),html模板里面不能有``符号,注释都不行``//varreg=newRegExp(`(^|&)${name}=([^&]*)(&|$),"i”)这样也不支持varreg=newRegExp(`(^|&)${name}=(</div> </li> <li><a href="/article/1947394505405689856.htm" title="vue项目使用tsx" target="_blank">vue项目使用tsx</a> <span class="text-muted"></span> <div>1、vue2.7中使用webpack处理,配置如下{test:/\.(ts|tsx)$/,use:[{loader:'babel-loader',options:{presets:['@babel/preset-env','@vue/babel-preset-jsx']}},{loader:'ts-loader',options:{appendTsSuffixTo:[/\.vue$/]//vue文</div> </li> <li><a href="/article/1947035574640635904.htm" title="2025年面试官常用的前端开发笔试考题" target="_blank">2025年面试官常用的前端开发笔试考题</a> <span class="text-muted">豆豆(前端开发+ui设计)</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E5%92%8C%E5%8F%91%E5%B1%95/1.htm">职场和发展</a> <div>填空题(20道)ReactHooks中,用于模拟类组件生命周期componentDidMount的Hook是________。useEffect在Vue3中,使用________API可以替代Vue2中的data和methods。CompositionWebpack的________插件可以帮助将CSS提取到单独的文件中。MiniCssExtractPlugin在JavaScript中,Promi</div> </li> <li><a href="/article/1947018283777585152.htm" title="Webpack构建流程详解" target="_blank">Webpack构建流程详解</a> <span class="text-muted">TEN01Y</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>Webpack的构建流程从一个或多个入口文件开始,递归分析项目中所有的依赖,最后将这些依赖打包成一个或多个输出文件。这个过程包括很多步骤,每个步骤都有特定的任务,Loader和Plugin可以插入到这些步骤中以完成文件转换或扩展功能。以下我会详细说明Webpack的整个构建流程,包括从初始化配置到生成最终的打包结果。1.初始化(Initialization)Webpack的打包流程从初始化开始,它</div> </li> <li><a href="/article/1947016138735022080.htm" title="Vite 项目构建优化详解" target="_blank">Vite 项目构建优化详解</a> <span class="text-muted">aiguangyuan</span> <a class="tag" taget="_blank" href="/search/Vite/1.htm">Vite</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/1.htm">前端开发</a><a class="tag" taget="_blank" href="/search/Vite/1.htm">Vite</a> <div>1.相关面试题1.1.Vite相比Webpack有哪些优势?Vite相较于Webpack的主要优势包括:极速启动:Vite使用原生ES模块进行开发时的依赖加载,无需像Webpack一样对整个项目进行预打包。因此,Vite的冷启动速度非常快,尤其是在大型项目中尤为明显。即时热更新(HMR):Vite的HMR速度更快更灵敏,因为它基于ES模块,仅更新受影响的模块,而不需要重新构建整个包。更少的配置:V</div> </li> <li><a href="/article/1947008955775512576.htm" title="webpack将组件vue进行编译混淆,并能正常使用编译之后的文件" target="_blank">webpack将组件vue进行编译混淆,并能正常使用编译之后的文件</a> <span class="text-muted">web前端神器</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>介绍:我们在开发的过程中有很多组件都需要复用,特别是我们耗费了好几天时间写出来的组件,比如自己写的表格组件,流程图组件等。总之都是自己不断测试,不断编写耗费了大把的精力写的。直接用到自己的项目中倒是无所谓,如果是把自己写的组件给别人,这里就涉及到自己的劳动成功了,特别是项目尾款还没到账的情况下,代码都给别人了对自己是很不利的。所以这节课的内容很重要,教大家如何将自己的写的vue组件用webpack</div> </li> <li><a href="/article/1946781392616615936.htm" title="webpack相关" target="_blank">webpack相关</a> <span class="text-muted">Komorebi_9999</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>一、基础打包指令#基本打包(默认使用webpack.config.js配置)npxwebpack#指定模式(开发/生产)npxwebpack--modedevelopment#开发模式(未压缩,保留注释)npxwebpack--modeproduction#生产模式(自动压缩、优化)二、配置文件相关#指定自定义配置文件npxwebpack--config配置文件名.js#例如:webpack.co</div> </li> <li><a href="/article/1946625689457324032.htm" title="前端构建工具 Webpack 5 的优化策略与高级配置" target="_blank">前端构建工具 Webpack 5 的优化策略与高级配置</a> <span class="text-muted">码力无边-OEC</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/web/1.htm">web</a> <div>前端构建工具Webpack5的优化策略与高级配置当你的项目启动需要一分钟,或者每次热更新都像在“编译整个宇宙”时,你可能已经意识到了一个问题:前端构建性能,正成为开发效率的瓶颈。Webpack作为现代前端开发的基石,其配置的优劣直接决定了项目的开发体验和最终产物的质量。奇怪的是,很多开发者满足于脚手架生成的默认配置,却忽略了Webpack5带来的巨大优化潜力。本文将深入Webpack5的核心,带你</div> </li> <li><a href="/article/1946533329478152192.htm" title="【Vue CLI】手把手教你撸插件" target="_blank">【Vue CLI】手把手教你撸插件</a> <span class="text-muted">vivo互联网技术</span> <div>本文首发于vivo互联网技术微信公众号链接:https://mp.weixin.qq.com/s/Rl8XLUX7isjXNUmbw0-wow作者:ZhuPing现如今Vue作为主流的前端框架之一,其健全的配套工具,活跃的开源社区,让广发码农热衷追捧。VueCLI作为其官方的开发构建工具,目前已更新迭代到4.x版本,其内部集成了日常开发用到的打包压缩等功能,简化了常规自己动手配置webpack的烦</div> </li> <li><a href="/article/1946459643396026368.htm" title="2024 前端技术指南:从趋势到实战,构建你的知识地图" target="_blank">2024 前端技术指南:从趋势到实战,构建你的知识地图</a> <span class="text-muted">王旭晨</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>一、2024前端领域的“破局者”与“新势力”2024年的前端圈依然热闹非凡,技术迭代与行业焦虑并存。React19带来的useActionState与服务端渲染升级,Vite6的多线程编译挑战Webpack的地位,Bun和Deno对Node.js发起的性能冲击,都在重塑开发者的选择。而尤雨溪创立VoidZero融资460万美金,更是为开源商业化注入了一剂强心针。尽管“前端已死”的论调此起彼伏,但技</div> </li> <li><a href="/article/1946393581426110464.htm" title="2023-03-06至2023-03-12" target="_blank">2023-03-06至2023-03-12</a> <span class="text-muted">独行者103</span> <div>这周要求重构代码,将vue2+webpack+antdv转换成vue3+vite+elementui,也算是带薪学习了。不过,看上去改了很多东西,真的很难办。就算是一个高德地图和动态路由,我都改的非常困难。这又是一个巨大的工程。看了古德里安写的《闪击英雄》,也看了隆美尔的《步兵突击》,不过《闪击英雄》要钱,我需要另找。现在在看隆美尔写的《步兵突击》。序言评价还算客观的,肯定了这些将领的军事才能的同</div> </li> <li><a href="/article/1943974618851241984.htm" title="Vue3+Vite+TS+Axios整合详细教程" target="_blank">Vue3+Vite+TS+Axios整合详细教程</a> <span class="text-muted">老马聊技术</span> <a class="tag" taget="_blank" href="/search/Vue/1.htm">Vue</a><a class="tag" taget="_blank" href="/search/Vite/1.htm">Vite</a><a class="tag" taget="_blank" href="/search/TS/1.htm">TS</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a> <div>1.Vite简介Vite是新一代的前端构建工具,在尤雨溪开发Vue3.0的时候诞生。类似于Webpack+Webpack-dev-server。其主要利用浏览器ESM特性导入组织代码,在服务器端按需编译返回,完全跳过了打包这个概念,服务器随起随用。生产中利用Rollup作为打包工具,号称下一代的前端构建工具。vite是一种新型的前端构建工具,能够显著的提升前端开发者的体验。它主要有俩部分组成:一个</div> </li> <li><a href="/article/1943875785089675264.htm" title="Webpack5 多页面实践" target="_blank">Webpack5 多页面实践</a> <span class="text-muted"></span> <div>特性维度单页面应用-SPA多页面统一目录-MPA多页面单独部署-MPA入口数量单个,只有一个HTML文件多个,多个HTML文件多个,多个HTML文件,分别打包输出资源输出结构所有资源输出到统一目录(如js/,css/)所有页面的资源共用js/,css/等目录每页资源放在各自目录(如index/js/,index/css/)公共资源复用高:依赖打入主包或懒加载chunk,资源完全共享中:可通过spl</div> </li> <li><a href="/article/5.htm" title="[星球大战]阿纳金的背叛" target="_blank">[星球大战]阿纳金的背叛</a> <span class="text-muted">comsci</span> <div>       本来杰迪圣殿的长老是不同意让阿纳金接受训练的.........     但是由于政治原因,长老会妥协了...这给邪恶的力量带来了机会     所以......现代的地球联邦接受了这个教训...绝对不让某些年轻人进入学院    </div> </li> <li><a href="/article/132.htm" title="看懂它,你就可以任性的玩耍了!" target="_blank">看懂它,你就可以任性的玩耍了!</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>          javascript作为前端开发的标配技能,如果不掌握好它的三大特点:1.原型 2.作用域 3. 闭包 ,又怎么可以说你学好了这门语言呢?如果标配的技能都没有撑握好,怎么可以任性的玩耍呢?怎么验证自己学好了以上三个基本点呢,我找到一段不错的代码,稍加改动,如果能够读懂它,那么你就可以任性了。 function jClass(b</div> </li> <li><a href="/article/259.htm" title="Java常用工具包 Jodd" target="_blank">Java常用工具包 Jodd</a> <span class="text-muted">Kai_Ge</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jodd/1.htm">jodd</a> <div>Jodd 是一个开源的 Java 工具集, 包含一些实用的工具类和小型框架。简单,却很强大! 写道 Jodd = Tools + IoC + MVC + DB + AOP + TX + JSON + HTML < 1.5 Mb Jodd 被分成众多模块,按需选择,其中 工具类模块有: jodd-core    &nb</div> </li> <li><a href="/article/386.htm" title="SpringMvc下载" target="_blank">SpringMvc下载</a> <span class="text-muted">120153216</span> <a class="tag" taget="_blank" href="/search/springMVC/1.htm">springMVC</a> <div>@RequestMapping(value = WebUrlConstant.DOWNLOAD) public void download(HttpServletRequest request,HttpServletResponse response,String fileName) { OutputStream os = null; InputStream is = null; </div> </li> <li><a href="/article/513.htm" title="Python 标准异常总结" target="_blank">Python 标准异常总结</a> <span class="text-muted">2002wmj</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>Python标准异常总结 AssertionError 断言语句(assert)失败 AttributeError 尝试访问未知的对象属性 EOFError 用户输入文件末尾标志EOF(Ctrl+d) FloatingPointError 浮点计算错误 GeneratorExit generator.close()方法被调用的时候 ImportError 导入模块失</div> </li> <li><a href="/article/640.htm" title="SQL函数返回临时表结构的数据用于查询" target="_blank">SQL函数返回临时表结构的数据用于查询</a> <span class="text-muted">357029540</span> <a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a> <div>这两天在做一个查询的SQL,这个SQL的一个条件是通过游标实现另外两张表查询出一个多条数据,这些数据都是INT类型,然后用IN条件进行查询,并且查询这两张表需要通过外部传入参数才能查询出所需数据,于是想到了用SQL函数返回值,并且也这样做了,由于是返回多条数据,所以把查询出来的INT类型值都拼接为了字符串,这时就遇到问题了,在查询SQL中因为条件是INT值,SQL函数的CAST和CONVERST都</div> </li> <li><a href="/article/767.htm" title="java 时间格式化 | 比较大小| 时区 个人笔记" target="_blank">java 时间格式化 | 比较大小| 时区 个人笔记</a> <span class="text-muted">7454103</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/MyEclipse/1.htm">MyEclipse</a> <div>个人总结! 不当之处多多包含! 引用 1.0 如何设置 tomcat 的时区:          位置:(catalina.bat---JAVA_OPTS  下面加上)          set JAVA_OPT</div> </li> <li><a href="/article/894.htm" title="时间获取Clander的用法" target="_blank">时间获取Clander的用法</a> <span class="text-muted">adminjun</span> <a class="tag" taget="_blank" href="/search/Clander/1.htm">Clander</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4/1.htm">时间</a> <div>/**    * 得到几天前的时间    * @param d    * @param day    * @return    */   public static Date getDateBefore(Date d,int day){    Calend</div> </li> <li><a href="/article/1021.htm" title="JVM初探与设置" target="_blank">JVM初探与设置</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台</div> </li> <li><a href="/article/1148.htm" title="SQL中ON和WHERE的区别" target="_blank">SQL中ON和WHERE的区别</a> <span class="text-muted">avords</span> <div>SQL中ON和WHERE的区别   数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。   www.2cto.com   在使用left jion时,on和where条件的区别如下:  1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。  </div> </li> <li><a href="/article/1275.htm" title="说说自信" target="_blank">说说自信</a> <span class="text-muted">houxinyou</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB/1.htm">生活</a> <div>自信的来源分为两种,一种是源于实力,一种源于头脑.实力是一个综合的评定,有自身的能力,能利用的资源等.比如我想去月亮上,要身体素质过硬,还要有飞船等等一系列的东西.这些都属于实力的一部分.而头脑不同,只要你头脑够简单就可以了!同样要上月亮上,你想,我一跳,1米,我多跳几下,跳个几年,应该就到了!什么?你说我会往下掉?你笨呀你!找个东西踩一下不就行了吗?     无论工作还</div> </li> <li><a href="/article/1402.htm" title="WEBLOGIC事务超时设置" target="_blank">WEBLOGIC事务超时设置</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/weblogic/1.htm">weblogic</a><a class="tag" taget="_blank" href="/search/jta/1.htm">jta</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1%E8%B6%85%E6%97%B6/1.htm">事务超时</a> <div>        系统中统计数据,由于调用统计过程,执行时间超过了weblogic设置的时间,提示如下错误: 统计数据出错! 原因:The transaction is no longer active - status: 'Rolling Back. [Reason=weblogic.transaction.internal</div> </li> <li><a href="/article/1529.htm" title="两年已过去,再看该如何快速融入新团队" target="_blank">两年已过去,再看该如何快速融入新团队</a> <span class="text-muted">bingyingao</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a><a class="tag" taget="_blank" href="/search/%E8%9E%8D%E5%85%A5/1.htm">融入</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E6%96%B0%E5%9B%A2%E9%98%9F/1.htm">新团队</a> <div>偶得的空闲,翻到了两年前的帖子 该如何快速融入一个新团队,有所感触,就记下来,为下一个两年后的今天做参考。     时隔两年半之后的今天,再来看当初的这个博客,别有一番滋味。而我已经于今年三月份离开了当初所在的团队,加入另外的一个项目组,2011年的这篇博客之后的时光,我很好的融入了那个团队,而直到现在和同事们关系都特别好。大家在短短一年半的时间离一起经历了一</div> </li> <li><a href="/article/1656.htm" title="【Spark七十七】Spark分析Nginx和Apache的access.log" target="_blank">【Spark七十七】Spark分析Nginx和Apache的access.log</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a> <div>Spark分析Nginx和Apache的access.log,第一个问题是要对Nginx和Apache的access.log文件进行按行解析,按行解析就的方法是正则表达式:   Nginx的access.log解析正则表达式   val PATTERN = """([^ ]*) ([^ ]*) ([^ ]*) (\\[.*\\]) (\&q</div> </li> <li><a href="/article/1783.htm" title="Erlang patch" target="_blank">Erlang patch</a> <span class="text-muted">bookjovi</span> <a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a> <div>Totally five patchs committed to erlang otp, just small patchs. IMO, erlang really is a interesting programming language, I really like its concurrency feature. but the functional programming style </div> </li> <li><a href="/article/1910.htm" title="log4j日志路径中加入日期" target="_blank">log4j日志路径中加入日期</a> <span class="text-muted">bro_feng</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a> <div>要用log4j使用记录日志,日志路径有每日的日期,文件大小5M新增文件。 实现方式 log4j: <appender name="serviceLog" class="org.apache.log4j.RollingFileAppender"> <param name="Encoding" v</div> </li> <li><a href="/article/2037.htm" title="读《研磨设计模式》-代码笔记-桥接模式" target="_blank">读《研磨设计模式》-代码笔记-桥接模式</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ /** * 个人觉得关于桥接模式的例子,蜡笔和毛笔这个例子是最贴切的:http://www.cnblogs.com/zhenyulu/articles/67016.html * 笔和颜色是可分离的,蜡笔把两者耦合在一起了:一支蜡笔只有一种</div> </li> <li><a href="/article/2164.htm" title="windows7下SVN和Eclipse插件安装" target="_blank">windows7下SVN和Eclipse插件安装</a> <span class="text-muted">chenyu19891124</span> <a class="tag" taget="_blank" href="/search/eclipse%E6%8F%92%E4%BB%B6/1.htm">eclipse插件</a> <div>今天花了一天时间弄SVN和Eclipse插件的安装,今天弄好了。svn插件和Eclipse整合有两种方式,一种是直接下载插件包,二种是通过Eclipse在线更新。由于之前Eclipse版本和svn插件版本有差别,始终是没装上。最后在网上找到了适合的版本。所用的环境系统:windows7JDK:1.7svn插件包版本:1.8.16Eclipse:3.7.2工具下载地址:Eclipse下在地址:htt</div> </li> <li><a href="/article/2291.htm" title="[转帖]工作流引擎设计思路" target="_blank">[转帖]工作流引擎设计思路</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/workflow/1.htm">workflow</a><a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A%E5%BA%94%E7%94%A8/1.htm">企业应用</a> <div> 作为国内的同行,我非常希望在流程设计方面和大家交流,刚发现篇好文(那么好的文章,现在才发现,可惜),关于流程设计的一些原理,个人觉得本文站得高,看得远,比俺的文章有深度,转载如下 ================================================================================= 自开博以来不断有朋友来探讨工作流引擎该如何</div> </li> <li><a href="/article/2418.htm" title="Linux 查看内存,CPU及硬盘大小的方法" target="_blank">Linux 查看内存,CPU及硬盘大小的方法</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/cpu/1.htm">cpu</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E5%AD%98/1.htm">内存</a><a class="tag" taget="_blank" href="/search/%E7%A1%AC%E7%9B%98/1.htm">硬盘</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E5%B0%8F/1.htm">大小</a> <div>一、查看CPU信息的命令 [root@R4 ~]# cat /proc/cpuinfo |grep "model name" && cat /proc/cpuinfo |grep "physical id" model name : Intel(R) Xeon(R) CPU X5450 @ 3.00GHz model name : </div> </li> <li><a href="/article/2545.htm" title="linux 踢出在线用户" target="_blank">linux 踢出在线用户</a> <span class="text-muted">dongwei_6688</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>两个步骤: 1.用w命令找到要踢出的用户,比如下面:   [root@localhost ~]# w 18:16:55 up 39 days, 8:27, 3 users, load average: 0.03, 0.03, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT</div> </li> <li><a href="/article/2672.htm" title="放手吧,就像不曾拥有过一样" target="_blank">放手吧,就像不曾拥有过一样</a> <span class="text-muted">dcj3sjt126com</span> <div>内容提要: 静悠悠编著的《放手吧就像不曾拥有过一样》集结“全球华语世界最舒缓心灵”的精华故事,触碰生命最深层次的感动,献给全世界亿万读者。《放手吧就像不曾拥有过一样》的作者衷心地祝愿每一位读者都给自己一个重新出发的理由,将那些令你痛苦的、扛起的、背负的,一并都放下吧!把憔悴的面容换做一种清淡的微笑,把沉重的步伐调节成春天五线谱上的音符,让自己踏着轻快的节奏,在人生的海面上悠然漂荡,享受宁静与</div> </li> <li><a href="/article/2799.htm" title="php二进制安全的含义" target="_blank">php二进制安全的含义</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a> <div>PHP里,有string的概念。 string里,每个字符的大小为byte(与PHP相比,Java的每个字符为Character,是UTF8字符,C语言的每个字符可以在编译时选择)。 byte里,有ASCII代码的字符,例如ABC,123,abc,也有一些特殊字符,例如回车,退格之类的。 特殊字符很多是不能显示的。或者说,他们的显示方式没有标准,例如编码65到哪儿都是字母A,编码97到哪儿都是字符</div> </li> <li><a href="/article/2926.htm" title="Linux下禁用T440s,X240的一体化触摸板(touchpad)" target="_blank">Linux下禁用T440s,X240的一体化触摸板(touchpad)</a> <span class="text-muted">gashero</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ThinkPad/1.htm">ThinkPad</a><a class="tag" taget="_blank" href="/search/%E8%A7%A6%E6%91%B8%E6%9D%BF/1.htm">触摸板</a> <div>自打1月买了Thinkpad T440s就一直很火大,其中最让人恼火的莫过于触摸板。   Thinkpad的经典就包括用了小红点(TrackPoint)。但是小红点只能定位,还是需要鼠标的左右键的。但是自打T440s等开始启用了一体化触摸板,不再有实体的按键了。问题是要是好用也行。   实际使用中,触摸板一堆问题,比如定位有抖动,以及按键时会有飘逸。这就导致了单击经常就</div> </li> <li><a href="/article/3053.htm" title="graph_dfs" target="_blank">graph_dfs</a> <span class="text-muted">hcx2013</span> <a class="tag" taget="_blank" href="/search/Graph/1.htm">Graph</a> <div>package edu.xidian.graph; class MyStack { private final int SIZE = 20; private int[] st; private int top; public MyStack() { st = new int[SIZE]; top = -1; } public void push(i</div> </li> <li><a href="/article/3180.htm" title="Spring4.1新特性——Spring核心部分及其他" target="_blank">Spring4.1新特性——Spring核心部分及其他</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/spring+4.1/1.htm">spring 4.1</a> <div>目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异常处理 Spring4.1新特性——数据库集成测试脚本初始化 Spring4.1新特性——Spring MVC增强 Spring4.1新特性——页面自动化测试框架Spring MVC T</div> </li> <li><a href="/article/3307.htm" title="配置HiveServer2的安全策略之自定义用户名密码验证" target="_blank">配置HiveServer2的安全策略之自定义用户名密码验证</a> <span class="text-muted">liyonghui160com</span> <div>    具体从网上看   http://doc.mapr.com/display/MapR/Using+HiveServer2#UsingHiveServer2-ConfiguringCustomAuthentication   LDAP Authentication using OpenLDAP Setting </div> </li> <li><a href="/article/3434.htm" title="一位30多的程序员生涯经验总结" target="_blank">一位30多的程序员生涯经验总结</a> <span class="text-muted">pda158</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB/1.htm">生活</a><a class="tag" taget="_blank" href="/search/%E5%92%A8%E8%AF%A2/1.htm">咨询</a> <div>1.客户在接触到产品之后,才会真正明白自己的需求。   这是我在我的第一份工作上面学来的。只有当我们给客户展示产品的时候,他们才会意识到哪些是必须的。给出一个功能性原型设计远远比一张长长的文字表格要好。 2.只要有充足的时间,所有安全防御系统都将失败。   安全防御现如今是全世界都在关注的大课题、大挑战。我们必须时时刻刻积极完善它,因为黑客只要有一次成功,就可以彻底打败你。   3.</div> </li> <li><a href="/article/3561.htm" title="分布式web服务架构的演变" target="_blank">分布式web服务架构的演变</a> <span class="text-muted">自由的奴隶</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a> <div>最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们只关注架构的演变历程,因此就假设这个时候已经是托管了一台主机,并且有一定的带宽了,这个时候由于网站具备了一定的特色,吸引了部分人访问,逐渐你发现系统的压力越来越高,响应速度越来越慢,而这个时候比较明显的是数据库和应用互相影响,应用出问题了,数据库也很容易出现问题,而数据库出问题的时候,应用也容易</div> </li> <li><a href="/article/3688.htm" title="初探Druid连接池之二——慢SQL日志记录" target="_blank">初探Druid连接池之二——慢SQL日志记录</a> <span class="text-muted">xingsan_zhang</span> <a class="tag" taget="_blank" href="/search/%E6%97%A5%E5%BF%97/1.htm">日志</a><a class="tag" taget="_blank" href="/search/%E8%BF%9E%E6%8E%A5%E6%B1%A0/1.htm">连接池</a><a class="tag" taget="_blank" href="/search/druid/1.htm">druid</a><a class="tag" taget="_blank" href="/search/%E6%85%A2SQL/1.htm">慢SQL</a> <div>由于工作原因,这里先不说连接数据库部分的配置,后面会补上,直接进入慢SQL日志记录。   1.applicationContext.xml中增加如下配置: <bean abstract="true" id="mysql_database" class="com.alibaba.druid.pool.DruidDataSourc</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>