其中
a.js、
b.js、
c.js内容分别如下:
在文件夹下新建文件
webpack.config.js,在文件中写配置:
目前浏览器并不能自动执行模块化代码,所以需要
进行webpack的配置:打开终端,切换到文件夹所在目录内层,然后执行命令
npm init -y,在文件夹中就会默认生成一个
package.json,里面的配置参数均为默认,自己可以根据情况进行修改:
然后执行命令
npm i -D webpack,然后多了一个
node_modules文件夹,里面都是相关依赖。在文件
package.json中,在
scripts中添加命令
dev: "webpack",然后在终端中输入命令
npm run dev,控制台会进行webpack的打包和输出相关文件信息:
此时,dist文件夹就会多一个app.js,里面就是webpack打包后整合到一起的js代码。将src的index.html拷贝一份到dist目录中,然后引入dist目录的app.js(
<script src=“./app.js”></script>),打开这个拷贝的index.html,在控制台中就可以看到打印的三句话:“this is a this is b this is c”。
还是上面的文件夹webpack-exam,将dist中的html文件删除,接下来我们通过安装webpack的html插件来自动创建html文件。打开终端,输入npm i -D html-webpack-plugin,就会开始安装html的插件,安装完成后,在package.json中的dependencies中会多出关键html插件的信息("html-webpack-plugin": "^2.30.1")。在webpack.config.js中,导入html-webpack-plugin,然后新增plugins,new出那个对象:
然后到终端执行
npm run dev,重新打包,可以看到除了在dist文件夹中新生成app.js之外,还有一个index.html文件,其中还自动引入了脚本app.js(在终端中可以看到相关的文件信息)。
如果我们在src中有html文件并写好了一些结构,同样可以打包创建html文件。删除dist中的文件,在src中新建index.html,写一个div:
然后在webpack配置文件中进行配置:
在终端中再次进行打包
npm run dev,在dist目录中出现app.js和hello.html。
loader
loader就是webpack用来预处理模块的,在一个模块被引入之前,会预先使用loader处理模块的内容。浏览器不能直接执行react的语法,只能执行直接的js,所以项目需要有react、babel等配置。 首先在项目中引入react相关,在终端输入命令npm i -S react react-dom来安装react的依赖,在package.json的dependencies中就会出现"react": "^16.2.0"和"react-dom": "^16.2.0",表示已经成功引入react。此外,还要引入babel,在终端中输入npm i -D babel-loader babel-core来安装babel的依赖,在package.json的devDependencies中出现"babel-core": "^6.26.0"和"babel-loader": "^7.1.2"。到webpack配置文件中写入react的相关配置:
所以还要安装react的预设,在终端输入
npm i -D babel-preset-react,相关依赖
"babel-preset-react": "^6.24.1"在配置中显示更新。在src的index.js中写代码:
重新打包运行
npm run dev,在本地打开打开dist文件夹下的hello.html文件,即可看到:
服务器默认找 index.html, 如果你的文件名是 hello.html, 那就需要在地址栏手动输入 hello.html
devserver
这是一个服务器,让项目运行在服务器而不是本地。 在终端输入npm i -D webpack-dev-server安装devserver服务器,在package.json的devDependencies中可以看到"webpack-dev-server": "^2.11.1"。然后在scripts中添加命令start——"start": "webpack-dev-server" 在终端中输入命令npm run start,devserver服务器就可以运行起来了。其中关于服务器的一些信息在终端会打印出来,服务器启动完成之后还会帮我们进行打包,打包后的东西并不是到本地(所以dist文件夹是空的),而是到内存中,供浏览器加载。 关于devserver还可以进行一些自定义的配置(webpack.config.json):
还要在webpack.config.js中写上css的相关loader:
use里传一个数组,当遇到css文件时,先用css-loader来处理,当内容处理完成得到结果后,再由style.loader进行处理,也由此可见,use里是从后往前加载。然后在终端输入命令
npm i -D style-loader来安装style-loader,输入
npm i -D css-loader来安装css-loader。启动devserver,即可看到css生效。
引入图片
在src新建组织文件和结构目录如下:
在style的main.css中写:
body { background: url(../img/scm.jpg); } 在index.js中引入common中的样式:
import ‘./common/style/main.css'; 对于webpack来说,css、图片、字体等都是模块,加载不同的模块需要不同的loader。所以这里我们需要使用处理图片的loader。在webpack.config.js中添加:
或
所以我们需要在终端中安装file-loader的依赖
npm i -D file-loader。重启devserver即可。
在浏览器的控制台中可以看到,图片路径被打包后的显示方式和原来的是不一样的:
退出devserver,直接用
npm run dev的方式打包后,在dist目录下可以看到图片被打包后的命名方式也和原先的是不一样的,和上面b529e...jpg一样。 如果我们在jsx中要使用img标签来引用这个图片,做法:
增强的file-loader:url-loader url-loader不是帮我们输出图片加载路径,而是把图片编码成了另外一种形式,直接写进页面里。可是当图片很大时,这个字符串就会变得非常庞大,它会让加载文件也变得很大,所以当图片文件过大时,我们要让它打包,让它去请求,如果图片很小,直接使用url-loader写进页面。 在终端输入npm i -D url-loader安装url-loader。如果要将所有图片用url-loader来处理,可以在webpack.config.js中这么写:
url-loader是采用编码64的方式将图片写进页面里。当图片过大时,会让加载文件也变得庞大,所以我们可以进行一些限制,比如设置如果图片文件大约没有超过10kb就用url-loader的方式处理:
由于之前引入的图片都较大,所以我们可以看到在浏览器控制台中,img都是以路径的方式显示的。
有时候我们使用第三方的字体,有些字体是提供npm下载的。以fontawesome为例,在终端中输入npm i -S font-awesome安装fontawesome字体。安装成功后,在package.json可以看到font-awesome的相关记录。在node_module文件夹中可以看到font-aewsome的相关依赖。在index.js中使用这个库的文字:
然后在package.json中,scripts中的babel删除插件的那些字符:"babel": "babel src/app.js"。在终端中输入npm run babel,可以发现箭头函数和类也能被正确编译为es5。 将编译后的代码输出到文件:在package.json的scripts中,添加babel的指令:"babel": "babel src/app.js -o out/a.js",表示将编译后的代码输出到out文件夹的a.js文件中,在babel-exam文件夹中新建文件out,在终端输入命令npm run babel,在out文件夹可以看到输出的a.js文件,里面就是babel编译后的js代码。
在官网的try it out中可以自己去试着看看编译后的es5代码。
babel-loader
babel预设 还是使用前面的webpack-exam为例。打开官网/plugins,可以看到几种官方预设,比如安装env预设,点击进入相应页面,根据提示在终端输入npm i -D babel-preset-env安装env预设,所以在webpack.config.js中,babel-loader的预设除了react还有env: