npm config set prefix “D:\dev\nodejs\node_modules\npm\node_global_modules”
npm config set cache “D:\dev\nodejs\node_modules\npm\node_cache”
执行成功后,可以用 npm config ls
命令查看配置的结果,效果如图:
第三步:
验证配置成功后,需要配置环境变量。在环境变量中,新建一个系统变量,变量名:NODE_HOME
,变量值:D:\dev\nodejs
,效果如图:
在Path
变量名中,新建变量值:
%NODE_HOME%
%NOED_HOME%\node_modules
%NODE_HOME%\node_modules\npm\node_global_modules\
效果如图:
保存之后,可以重新执行全局安装命令,查看NPM
依赖包在全局的默认安装目录是否为我们配置好的目录,如果成功下载到了设置后的目录下,就成功修改了默认全局安装路径。
(6)NPM Scripts
NPM
不仅可以用于模块管理,还可以用于执行脚本。可以在package.json
文件中添加scripts
字段,用于指定脚本命令,以供NPM
直接调用,示例如下:
// package.json
{
“scripts”: {
“build”: “webpack”,
“start”: “node src/scripts/dev.js”
}
}
scripts
里面放的是npm
要执行的命令,格式是key-value
形式,为了简化操作,具体命令为value
,自定义的简化命令为key
,当npm
运行key
命令时,等同于执行后面的value
命令。例如,在package.json
添加上面字段之后,可以直接使用npm run build
和npm run start
命令了 ,而且npm run start
命令还可以简写成npm start
。
注意:上面提到的简写,只有
npm run start
才可以简写,并不是所有script命令都支持这种简写的方式。
除了
npm
外,还有一些包管理工具,主要是针对npm
的下载速度慢、node_modules
混乱等缺点设计的,例如yarn和 pnpm。
在后面会讲到使用create-react-app
脚手架工具搭建React
开发环境,在自动生成的package.json
文件中配置的scripts
字段内容是:
“scripts”: {
“start”: “react-scripts start”,
“build”: “react-scripts build”,
“test”: “react-scripts test”,
“eject”: “react-scripts eject”
}
我们在命令窗口中直接执行npm start
就相当于执行了npm react-scripts start
命令,通过这个命令可以启动React
服务,并且在浏览器输入IP
地址就可以访问React项目了。
1.3.3、安装Webpack
(1)安装Webpack
webpack
的安装需要使用NPM
来完成,安装命令如下:
全局安装
npm install -g webpack
安装到项目目录中
npm install --save-dev webpack
安装好之后,就可以使用webpack
的命令了。
(2)安装Webpack-cli
Webpack-cli是 Webpack
的 CLI
(Command-line interface)工具,如果在项目中,我们可以使用下面的方式安装:
本地安装
npm install webpack-cli --save-dev
全局安装
npm install webpack-cli -g
由于webpack
是用于项目构建和打包的工具,所以我们在安装时使用--save-dev
命令把webpack-cli
放到开发环境的字段下。
2、Webpack中常规配置项介绍
2.1、webpack.config.js 配置文件
当我们安装好webpack
之后,就可以使用webpack
命令了,比如要将一个main.js
文件打包成一个bundle.js
文件,可以使用如下命令:
webpack main.js bundle.js
一般在实际的项目开发中,要把这些命令写到一个webpack.config.js
的文件中。上面打包操作可以做如下配置:
module.exports = {
entry: ‘./main.js’,
output: {
filename: ‘bundle.js’
}
};
在上面的配置文件中,我们配置了项目的入口(entry
)和出口(output
),在该项目的关系图中,entry
字段指定了入口文件,即把main.js
作为起点。output
字段是指定了输出位置,即指定webpack
把整理后的资源放在哪里。
2.2、webpack核心概念
webpack
主要有4个核心概念:
入口(entry
):项目入口,也是webpack
所有依赖关系图的起点。
出口(output
):指定webpack
打包应用程序的目录。
加载器(loader
):加载需要处理的模块,对模块进行转换处理。
插件(plugins
):定义项目要用到的插件。
2.2.1、webpack入口(entry)和出口(output)
在前面的内容中,我们已经了解到了,webpack
是一个模块打包工具,需要处理具有依赖关系的各个模块,这些模块会构成一个依赖关系图(dependency graph)。webpack
的入口就是这张关系图的起点,指的是入口文件。webpack
出口指的是需要把这张关系图导出到哪个文件中,即导出文件。
(1)入口(entry)
entry
字段指定了入口文件,也可以理解为当前项目启动时运行的第一个文件,语法为:
entry: string | object | Arrary
entry
字段支持多种类型,值可以是字符串、对象、数组。简单来理解,就是entry
可以指定一个文件入口,也可以指定多文件入口。我们举例来说明entry
的用法:
单文件入口示例
// 使用key-value方式
module.exports = {
entry: ‘path/to/my/entry/main.js’
};
// 或者使用对象方式
module.exports = {
entry: {
main: ‘path/to/my/entry/main.js’
}
};
// entry也可以使用数组指定多个入口文件路径,输出时会合并输出
module.exports = {
mode: ‘development’,
entry: [‘./src/app.js’, ‘./src/home.js’],
output: {
filename: ‘array.js’
}
};
多文件入口
// entry配置3个独立的入口文件,会打包成3个对应的bundle
module.exports = {
entry: {
home: ‘path/to/my/entry/home.js’,
search: ‘path/to/my/entry/search.js’,
list: ‘path/to/my/entry/list.js’
}
};
(2)出口(output)
output
字段是指定entry
对应文件编译打包后的输出位置,也可以理解为指定webpack
把整理好的资源放到哪里。output
字段常用的属性有:
-
path
:指定打包完成的文件存放的路径; -
filename
:指定打包完成的文件的文件名称; -
publicPath
:指定一个在浏览器中被引用的URL地址;
如果不指定path
参数,将默认将打包文件输出到webpack.config.js
同级目录下;如果不指定output
,打包文件会默认输出到dis/main.js
,即output
字段的path
属性默认是dis
,filename
属性默认是main
。
一个webpack
的配置可以包含多个entry
,但是只能有一个output
。对于不同的entry可以通过output.filename
占位符语法来区分,例如:
module.exports = {
entry: {
home: ‘path/to/my/entry/home.js’,
search: ‘path/to/my/entry/search.js’,
list: ‘path/to/my/entry/list.js’
},
output: {
filename: ‘[name].js’,
path: __dirname + ‘/dist’
}
};
在上面的配置中,output.filename
指定的[name]
就是一个占位符,对应的是entry
中的key
(home
、search
、list
),最终输出的结果是:
path/to/my/entry/home.js → dist/home.js
path/to/my/entry/search.js → dist/search.js
path/to/my/entry/list.js → dist/list.js
目前webpack
支持的占位符有:
| 占位符 | 含义 |
| — | — |
| [hash]
| 模块标识符的hash
|
| [chunkhash]
| chunk
内容的hash
|
| [name]
| 模块的名称 |
| [id]
| 模块标识符 |
| [query]
| 模块的query
,例如,文件名 ?
后面的字符串 |
| [function]
| 一个 return
出一个 string
作为 filename
的函数 |
2.2.2、webpack 加载器(loader)
loader
是解析处理器,大家都知道,webpack
的任务就是把具有依赖关系的各个文件进行整合并打包,这些文件的类型有很多,比如.html
、.css
、.js
、.scss
、.jpg
等等。但是webpack
只认识JavaScript
文件,那如何识别其他文件呢?loader
就解决了这个问题。比如,很多浏览器不支持ES6
语法,webpack
可以通过loader
配置,将ES6
语法转化为ES5
的语法,还可以将图片转化为base64
的dataURL
,还可以通过loader
直接在JavaScript
文件中使用import
引入css
和html
。
loader
在webpack
构建文件的过程中起着至关重要的作用,实现可以通过loader
识别出要对哪些文件进行预处理,然后loader
转换这些需要预处理的文件,并添加到bundle
(构建后的模块)中。在React
框架开发时,经常会用到JSX
这种扩展语言来编写DOM
,目前几乎所有的浏览器都不支持JSX
格式,那么loader
就可以在使用JSX
之前做一些预处理操作,将其转化成JavaScript
语言,示例如下:
module.exports = {
entry: {
app: ‘./app.js’
}
output: {
filename: ‘bundle.js’,
path: ‘./dist’
}
module: {
rules: [
{
test: /.(js|jsx)$/,
use: ‘babel-loader’
},
{
test: /.css$/,
use: ‘css-loader’
}
]
}
}
在上面的例子中,test
字段表示要对哪些类型的文件进行构建,use
字段表示要用哪些模块对该类型的文件进行构建。在test
项中使用/\.css$/
这种正则表达式来匹配需要处理的模块文件,即匹配以.css
为后缀的文件。
在配置loader
之前,use
中的模块是需要安装的,命令如下:
npm install --save-dev babel-loader
npm install --save-dev css-loader
提示:
在
webpack
的早期版本中,loader
的写法是:
module.exports = {
…
module: {
loaders: [
{
test: /\.(js|jsx)/,
loader: 'babel-loader'
},
......
]
}
}
webpack
最新版本中已经废弃了loaders
、loader
的写法,改成了rules
、use
。
2.2.3、webpack 插件(plugin)
plugin
在webpack
起着重要的作用,通过plugin
可以解决loader
解决不了的问题,以此来丰富webpack
的功能。webpack
本身就是有很多插件组成的,所以内置了很多插件。除了内置插件,我们也可以通过NPM
包的方式来使用插件,比如现在需要安装一个html-webpack-plugin
的插件,先执行安装命令:
npm install --save-dev html-webpack-plugin
然后在webpack.config.js
文件中配置plugins
:
var HtmlWebpackPlugin = require(‘html-webpack-plugin’);
module.exports = {
entry: {
app: ‘./app.js’
},
output: {
filename: ‘bundle.js’,
path: ‘./dist’
},
module: {
rules: [
{
test: /.(js|jsx)/,
use: ‘babel-loader’
},
{
test: /.css$/,
use: ‘css-loader’
}
]
},
plugins: [
new HtmlWebpackPlugin()
]
}
上面的示例中,plugins
参数为一个数组,可以传入多个plugin
,另外需要注意plugin
是可以带参数的,所以plugins
属性传入的必修为new
实例。
3、使用Babel转换JavaScript代码
3.1、什么是Babel
Babel
是一个JavaScript
的编译器,我们在webpack
中可以使用ES6
以上版本的语法写代码,但是目前主流的浏览器仅支持ES5
语法,通过Babel
可以将ES6+
语法自动转换成ES5
语法,来适配浏览器的JavaScript
解释器。
比如说,我们使用ES6
语法中的箭头函数实现代码:
(val) => (val + 1) ;
使用Babel
转化成ES5
语法后:
function(val){
return val+1 ;
}
3.2、babel-cli命令行工具的使用
在项目中安装babel-cli
,命令如下:
npm install --save-dev @babel/core @babel/cli
简写
npm i -D @babel/core @babel/cli
然后再安装转换规则:
安装 preset-env
npm i -D @babel/preset-env
执行 CLI 添加–presets
npx babel babel.js --presets=@babel/preset-env
测试babel-cli
命令行工具,先创建一个app.js
文件,输入下面的代码:
[1, 2, 3].map(n => n ** 2);
然后在命令行中输入下面命令:
npx babel app.js
或者 指定输出结果到固定文件
npx babel app.js --out-file appout.js
简写
npx babel app.js -o appout.js
转化命令执行成功后,app.js
的语法就变成了ES5
语法:
[1, 2, 3].map(function(n) {
return Math.pow(n, 2);
});
3.3、Babel配置文件
Babel
还支持配置文件的方式进行转化操作,配置文件支持两种形式:
(1)使用package.json
的babel
属性
示例:
{
“name”: “demo”,
“version”: “1.0.0”,
“babel”: {
“presets”: [“@babel/preset-env”]
}
}
(2)使用.babelrc
文件
在项目的根目录创建.babelrc
或.babelrc.js
文件,Babel
会在正在被转义的文件当前目录中查找一个.babelrc
文件, 如果不存在,它会向外层目录遍历目录树,直到找到一个 .babelrc
文件,或一个 package.json
文件中有 "babel": {}
。 在文件中配置如下:
{
“presets”: [“@babel/preset-env”]
}
3.4、在webpack中使用babel
第一步:安装依赖包
安装开发依赖
npm i webpack babel-loader webpack-cli @babel/core @babel/preset-env @babel/plugin-transform-runtime -D
将 runtime 作为依赖
npm i @babel/runtime -S
第二步:创建webpack.config.js
文件,配置如下:
module.exports = {
//…
module: {
rules: [
{
test: /.js$/,
use: [
{
loader: ‘babel-loader’,
options: {
presets: [
[
‘@babel/preset-env’,
{
useBuiltIns: ‘usage’
}
]
]
}
}
]
}
]
}
};
把Babel
配置到webpack.config.js
文件的options
中,或者是配置到.babelrc
文件, 或者使用package.json
的 babel
字段。
4、配置webpack-dev-server本地服务器
webpack-dev-server
就是一个Express
的小型服务器,通过Express
的中间件 webpack-dev-middleware
和 Webpack
进行交互的。
4.1、安装webpack-dev-server服务
在项目中安装:
npm i webpack-dev-server
启动服务:
npx webpack-dev-server
服务启动成功后,在浏览器中访问webpack-dev-server
的默认地址 localhost:8080
,就可以默认的index.html
页面,如果没有该页面,就会显示文件目录。
4.2、整合Webpack
将webpack-dev-server
服务整合到webpack
的配置文件中,webpack.config.js
配置文件内容如下:
const path = require(‘path’);
module.exports = {
//…
devServer: {
contentBase: path.join(__dirname, ‘dist’),
port: 9000 //服务器端口
}
};
还可以将webpack-dev-server
放到package.json
的scripts
里面,来简化服务启动命令:
{
“scripts”: {
“dev”: “webpack-dev-server --mode development --config webpack.config.dev.js --hot --inline --port 3000”
}
}
配置完成后,可以使用下面命令启动服务:
npm run dev
执行npm run dev
实际就是执行的对应webpack-dev-server
命令。
4.3、配置热加载
热加载也叫模块热替换( Hot Module Replacement ,简称HMR
),配置热加载后,在应用运行期间修改代码,不需要重新刷新页面就可以在浏览器中加载更新后的内容。 通过配置 webpack.HotModuleReplacementPlugin
插件来开启全局的 HMR
功能。
修改webpack.config.js
文件,开启热加载:
const path = require(‘path’);
module.exports = {
entry: ‘./src/index.js’,
devServer: {
open: true, //自动打开浏览器
contentBase: path.join(__dirname, ‘dist’),//指定服务器将从哪个目录去查找内容文件
port: 9000, //服务器端口
hot: true // 开启 hmr 支持
},
plugins: [
// 添加 hmr plugin
new webpack.HotModuleReplacementPlugin()
]
};
完成上面的配置后,重启服务,在浏览器访问默认地址 http://localhost:9000
,然后再修改JavaScript
代码,就可以实时看到效果了。
如果使用webpack-dev-server
的cli
功能只需要通过执行下面命令,就可以开启自动刷新功能:
webpack-dev-server --hot --inline
执行上面命令会自动将webpack.HotModuleReplacementPlugin
这个插件添加到 Webpack
的配置中去。这种是最简单的配置方式了。
4.4、本地服务器的常见配置项
常见配置如下:
修改端口号和 host
webpack-dev-server --port 3000 --host 127.0.0.1
启动inline 模式的自动刷新
webpack-dev-server --hot --inline
手动指定 webpack config 文件
webpack-dev-server --config webpack.xxx.js
指定 webpack 的 mode
webpack-dev-server --mode development
watch 功能,文件发生变化则触发重新编译
webpack-dev-server --watch
dev-server默认会将工作目录(当前目录)最为基本目录,可以手动修改它
webpack-dev-server --content-base ./build
查看帮助
webpack-dev-server -h
开启inline模式,自动刷新页面
webpack-dev-server --hot --inline
5、配置React开发环境
5.1、使用webpack配置React环境
5.1.1、搭建React项目
创建React
项目的文件夹,在项目根目录下打开命令提示符,执行初始化命令,生成package.json
文件:
npm init -y
依次执行下列命令,如果已经安装了cnpm
的话,可以使用cnpm
替代npm
命令,执行命令完成基础创建:
安装 react react-dom依赖
npm i react react-dom
安装 webpack 和 webpack-cli 开发依赖
npm i webpack webpack-cli -D
安装 babel
npm i babel-loader @babel/core @babel/preset-env -D
安装 babel preset-react
npm i @babel/preset-react -D
创建webpack.config.js
配置文件,并在配置文件中添加对JSX
语法的Babel
编译支持:
module.exports = {
resolve: {
extensions: [‘.wasm’, ‘.mjs’, ‘.js’, ‘.json’, ‘.jsx’]
},
module: {
rules: [
{
test: /.jsx?$/, // jsx/js文件的正则
exclude: /node_modules/, // 排除 node_modules 文件夹
use: {
// loader 是 babel
loader: ‘babel-loader’,
options: {
// babel 转义的配置选项
babelrc: false,
presets: [
// 添加 preset-react
require.resolve(‘@babel/preset-react’),
[require.resolve(‘@babel/preset-env’), {modules: false}]
],
cacheDirectory: true
}
}
}
]
}
};
在项目根目录创建 src/App.jsx
文件,src
是源文件目录,App.jsx
文件内容如下:
import React from ‘react’;
import ReactDOM from ‘react-dom’;
const App = () => {
return (
Hello React and Webpack
);
};
export default App;
ReactDOM.render(, document.getElementById(‘app’));
在src
目录下创建index.jsx
文件,内容如下:
import App from ‘./App’; // 这里可以省略.jsx
将文件添加到webpack.config.js
中的entry
:
module.exports = {
entry: ‘./src/index.jsx’,
// …
};
接下来在src
目录下创建index.html
文件,作为项目的模板,内容如下:
需要使用 html-webpack-plugin 插件来复制 index.html
到 dist
文件夹下。
首先是安装 html-webpack-plugin
:
npm i html-webpack-plugin -D
然后修改webpack.config.js
配置:
const HtmlWebPackPlugin = require(‘html-webpack-plugin’);
module.exports = {
// …
plugins: [
new HtmlWebPackPlugin({
template: ‘src/index.html’,
filename: ‘index.html’,
inject: true
})
]
};
上面的操作都完成之后,可以执行打包命令:
npx webpack --mode development
运行结果:
打包成功后,会在项目的根目录下自动生成dist
文件夹,存放的是webpack
编译打包后的文件。这时,我们就可以把打包的命令放到package.json
文件的scripts
中,配置如下:
//package.json文件
{
“scripts”: {
“build”: “webpack --mode production”
}
}
配置好了以后,我们就可以使用简化的命令来操作打包了:
npm run build
5.1.2、配置React项目的本地服务
(1)配置服务
第一步:安装webpack-dev-server
依赖:
npm i webpack-dev-server -D
第二步:在webpack.config.js
配置文件中添加服务相关配置,完整配置如下:
//webpackage.config.js
const path = require(‘path’);
const HtmlWebPackPlugin = require(‘html-webpack-plugin’);
module.exports = {
mode: ‘development’,
devtool: ‘cheap-module-source-map’,
devServer: {
contentBase: path.join(__dirname, ‘./src/’),
publicPath: ‘/’,
host: ‘127.0.0.1’,
port: 3000,
stats: {
colors: true
}
},
entry: ‘./src/index.jsx’,
// 将 jsx 添加到默认扩展名中,省略 jsx
resolve: {
extensions: [‘.wasm’, ‘.mjs’, ‘.js’, ‘.json’, ‘.jsx’]
},
module: {
rules: [
{
test: /.jsx?$/, // jsx文件的正则
exclude: /node_modules/, // 排除 node_modules 文件夹
use: {
// loader 是 babel
loader: ‘babel-loader’,
options: {
// babel 转义的配置选项
babelrc: false,
presets: [
// 添加 preset-react
require.resolve(‘@babel/preset-react’),
[require.resolve(‘@babel/preset-env’), {modules: false}]
],
cacheDirectory: true
}
}
}
]
},
plugins: [
new HtmlWebPackPlugin({
template: ‘src/index.html’,
filename: ‘index.html’,
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
配置,完整配置如下:
//webpackage.config.js
const path = require(‘path’);
const HtmlWebPackPlugin = require(‘html-webpack-plugin’);
module.exports = {
mode: ‘development’,
devtool: ‘cheap-module-source-map’,
devServer: {
contentBase: path.join(__dirname, ‘./src/’),
publicPath: ‘/’,
host: ‘127.0.0.1’,
port: 3000,
stats: {
colors: true
}
},
entry: ‘./src/index.jsx’,
// 将 jsx 添加到默认扩展名中,省略 jsx
resolve: {
extensions: [‘.wasm’, ‘.mjs’, ‘.js’, ‘.json’, ‘.jsx’]
},
module: {
rules: [
{
test: /.jsx?$/, // jsx文件的正则
exclude: /node_modules/, // 排除 node_modules 文件夹
use: {
// loader 是 babel
loader: ‘babel-loader’,
options: {
// babel 转义的配置选项
babelrc: false,
presets: [
// 添加 preset-react
require.resolve(‘@babel/preset-react’),
[require.resolve(‘@babel/preset-env’), {modules: false}]
],
cacheDirectory: true
}
}
}
]
},
plugins: [
new HtmlWebPackPlugin({
template: ‘src/index.html’,
filename: ‘index.html’,
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-zQBJImbO-1715086702587)]
[外链图片转存中…(img-P9wUZnKb-1715086702588)]
[外链图片转存中…(img-9TDQh3PJ-1715086702588)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!