webpack+react+redux+es6開發模式---續

一、前言

  之前介紹了webpack+react+redux+es6開發模式?,這個項目對于一個獨立的功能節點來說是沒有問題的。假如伴隨著源源不斷的需求,前段項目會涌現出更多的功能節點,需要獨立部署運行。為了更好地管理這些獨立的功能節點,我們需要利用webpack進行單獨的打包處理,針對不同的功能節點生成不同的配置文件

二、項目結構

  1.項目demo目錄圖片示例

  

  2.apps目錄圖片示例(project1和project2分別表示兩個不同的功能節點)

   

三、npm-scripts 命令

  package.json部分示

  

  接下來,會說明下每個命令的用途。

四、webpack的dll功能

  Dll是Webpack最近新加的功能, 我簡單介紹一下。

  Dll就是一個純純的依賴庫,它本身不能運行,是用來給你的app引用的。

  打包dll的時候,Webpack會將所有包含的庫做一個索引,寫在一個manifest文件中,而引用dll的代碼(dll user)在打包的時候,只需要讀取這個manifest文件,就可以了。

這么一來有幾個好處:

  • Dll打包以后是獨立存在的,只要其包含的庫沒有增減、升級,hash也不會變化,因此線上的dll代碼不需要隨著版本發布頻繁更新。

  • App部分代碼修改后,只需要編譯app部分的代碼,dll部分,只要包含的庫沒有增減、升級,就不需要重新打包。這樣也大大提高了每次編譯的速度。

  • 假設你有多個項目,使用了相同的一些依賴庫,它們就可以共用一個dll。

  1.webpack.config.js中關于Dll的配置如下

  

  webpack.DllPlugin?的選項中,?path?是manifest文件的輸出路徑;?name?是dll暴露的對象名,要跟?output.library?保持一致;?context?是解析包路徑的上下文,這個要跟接下來配置的dll user一致。

  如何進行打包呢,接下來就會用到上面提到的scripts命令(package.json文件中)。這里要說的命令是"dll project1"對應的命令,如下。

webpack --display-error-details --progress --colors -p --config config.project1.dll.js

  該命令會加載config.project1.dll.js,對應的配置內容如下:

var config = require('./webpack.config');
module.exports = config.webpackdll({key:'project1'//根目錄
    ,rootPath:__dirname
});

  執行"npm run?dll project1"命令,會輸出兩個文件一個是打包好的vendor.dll.js,一個就是manifest-vendor.json。由于在config.project1.dll.js中配置的key值是功能節點的名稱"project1",所以生成的兩個文件在apps/project1目錄下,如下圖所示。

  

  其中manifest-vendor.json大致的樣子如下圖所示。

  

  Webpack將每個庫都進行了編號索引,之后的dll user可以讀取這個文件,直接用id來引用。文件內容中的"name"對應的值'dll_vendor'?就是?webpack.config.js中關于Dll的配置中?DllPlugin 中關于 name值的配置,如下所示。

new webpack.DllPlugin({path: options.manifestPath||'apps/'+key+'/manifest-[name].json',//manifest.json 文件的輸出路徑,這個文件會用于后續的業務代碼打包name: options.manifestName||'dll_[name]',// dll 暴露的對象名,要跟 output.library 保持一致context: options.manifestContext||rootPath,//解析包路徑的上下文,這個要跟接下來配置的 webpack.config.js 一致
}),

  2.關于Dll user的配置

  

  DllReferencePlugin?的選項中,?context?需要跟之前保持一致,這個用來指導Webpack匹配manifest中庫的路徑;?manifest?用來引入剛才輸出的manifest文件。

?

  參考:http://www.tuicool.com/articles/NZ77re

五、開發環境

  開發人員開發項目的時候,使用 webpack devserver?啟動項目。這里接著說一個命令"dev-project1", 如下。

webpack-dev-server --devtool eval --display-error-details --progress --colors --hot --inline --config config.project1.js 

  config.project1.js的配置內容如下。

var config = require('./webpack.config');
//打印啟動信息
config.initPrint(__filename);
var path = require('path'); 
var cwd = process.cwd();//返回運行當前腳本的工作目錄的路徑
var baseRoot = "./apps/project1/src/"
var options = {//定義標識名(如果有多個應用,可以寫成 應用的名稱)key : 'project1',//定義各模塊的入口
  modules : {bundle: './project1-index.js'//入口
  }//根目錄
  ,rootPath:__dirname//webpack-dev-server啟動的端口,port:8000//相對路徑//,path: path.join(__dirname, '')//編譯后的路徑//,filename: '[name]/build/bundle.js'//定義各種加載器//,loaders: []//定義各種插件//,plugins:[]//定義路徑別名,即:require(alias)
  , alias: {"styles": path.join(cwd, baseRoot + "styles"),"less": path.join(cwd, baseRoot + "styles/less"),"actions": path.join(cwd,baseRoot + "actions"),"constants": path.join(cwd, baseRoot + "constants"),"images": path.join(cwd, baseRoot + "images"),"reducers": path.join(cwd, baseRoot + "reducers"),"stores": path.join(cwd, baseRoot + "stores"),"modules": path.join(cwd, baseRoot + "modules"),"components": path.join(cwd, baseRoot + "components"),"utils": path.join(cwd, baseRoot + "utils"),"routes": path.join(cwd, baseRoot + "routes"),"trd": path.join(cwd, baseRoot + "trd"),}
}
//服務端產出路徑
if(process.env.NODE_ENV==='prod') {//生產環境options.publicPath = '/project1-front';
}else if(process.env.NODE_ENV==='test') {//測試環境//options.publicPath = '/icop-sampleapp-frontend';
}else{//本地開發環境
}//構建webpack配置
module.exports = config.webpack(options);

  配置中的注解寫的很明確了,就不在啰嗦了。關于webpack.config.js中的webpack方法配置如下。

  

  執行 "npm run dev-project1"命令,啟動工程,瀏覽器中輸入“http://localhost:8000/apps/project1”,效果如下。

  

六、生產環境

  發布到生產環境上的程序是穩定的,不允許開發人員直接操作。為了提升服務訪問的效率,前端工程放到了要tomcat工程下。tomcat項目下的代碼還是我們開發人員所看到的的代碼?不是了已經!!!最后我要說的命令就是 "build-project1", 如下所示。

set NODE_ENV=prod&&webpack --display-error-details --progress --colors -p --config config.project1.js

  這個命令中設置了環境變量 NODE_ENV=prod,根據這個變量的配置,會有不同的 服務端產出路徑 的配置。例如, config.project1.js中的示例代碼,如下。

//服務端產出路徑
if(process.env.NODE_ENV==='prod') {//生產環境options.publicPath = '/project1-front';
}else if(process.env.NODE_ENV==='test') {//測試環境//options.publicPath = '/icop-sampleapp-frontend';
}else{//本地開發環境
}

  那么本地開發環境中對應的這個路徑是啥呢?webpack.config.js中的webpack方法中有這樣的配置,如下。

output: {path: options.path || path.join(rootPath, 'apps/'+key)//編譯后的輸出路徑, filename: options.filename || '/build/bundle.js', publicPath: options.publicPath || '/apps/'+key//服務端的路徑, chunkFilename: "/build/[name]_[hash].chunk.js"
},

  也就是默認的publicPath是'/apps/project1'(因為傳遞的key值是 'project1')。執行命令"npm run build-project1", 會在project1目錄下生成 build文件夾,內如如下。

  

  這些打包出來的文件是 tomcat中對應項目需要的。并且前端項目 project1中index.html也引入了其中的一些文件,如下所示。

  

  如何把我們前端項目 發布到 tomcat上呢?很簡單的,新建一個web工程,工程的名稱要注意, 要和 生產環境對應的 服務器產出路徑一致,即 "project1-front"。web.xml做一下簡單配置,如下。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>project1-front</display-name><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list>
</web-app>

  接下把前端項目功能節點project1目錄下面的文件(不包含"src"目錄)copy到剛剛新建的web項目(project1-front)中的 WebContent 目錄下,如下所示。

  

  最后啟動web工程,瀏覽器中輸入"http://localhost:8029/project1-front",效果如下。

  

?七、webpack的CommonsChunkPlugin提取公共代碼,以及懶加載方式

  相關鏈接:http://webpack.github.io/docs/long-term-caching.html

  在webpack.config.js中webpack方法對應的配置如下所示。

  

  路由各個功能節點的引入方式,變成如下。

  

?

  比較一下,使用懶加載方式(project1)和不是懶加載方式(project2)build之后產生文件的差異。

  apps/project1/build目錄

  

  apps/project2/build目錄

  

  很明顯,懶加載方式可以更好的解決性能問題,加快頁面加載速度。不同的功能模塊加載對應的chunk文件就可以了。

八、nodejs中exports與module.exports的區別

  http://cnodejs.org/topic/5231a630101e574521e45ef8

  http://zihua.li/2012/03/use-module-exports-or-exports-in-node/

  http://blog.csdn.net/zhou_xiao_cheng/article/details/52759632

  http://www.cnblogs.com/pigtail/archive/2013/01/14/2859555.html

九、教訓

  開始用懶加載模式的時候,啟動工程,出現如下錯誤。

vendor.dll.js:1 Uncaught Invariant Violation: Minified React error #130; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=130&args[]=object&args[]= for the full message or use the non-minified dev environment for full errors and additional helpful warnings.

  找了好長時間的原因,竟然是有一個js文件的導出方式的問題,如下。

  

  然而懶加載的時候,使用的require。這也就是為啥 import可以,require不行的原因了。坑了我好久啊!

  

  試了一下,要改成?module.exports = ModuleRouters。這樣才不會報錯。

十、項目下載地址

  https://github.com/hjzgg/webpack-react-redux-next

十一、項目演示地址

  http://study.hujunzheng.cn:8000/DEMO_FRONT

轉載于:https://www.cnblogs.com/hujunzheng/p/6294954.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531277.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531277.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531277.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JdbcTemplate使用小結

org.springframework.jdbc.core.JdbcTemplate.query(String sql, Object[] args, RowMapper<StaffUnionVO> rowMapper) throws DataAccessException 1.自定義rowMapper public class StaffUnionVO implements RowMapper<StaffUnionVO>, Serializable {private stat…

RabbitMQ安裝和使用(和Spring集成)

一、安裝Rabbit MQ   Rabbit MQ 是建立在強大的Erlang OTP平臺上&#xff0c;因此安裝Rabbit MQ的前提是安裝Erlang。通過下面兩個連接下載安裝3.2.3 版本&#xff1a; 下載并安裝 Eralng OTP For Windows (vR16B03)運行安裝 Rabbit MQ Server Windows Installer (v3.2.3)具體…

單點登錄實現(spring session+redis完成session共享)

一、前言 項目中用到的SSO&#xff0c;使用開源框架cas做的。簡單的了解了一下cas&#xff0c;并學習了一下 單點登錄的原理&#xff0c;有興趣的同學也可以學習一下&#xff0c;寫個demo玩一玩。 二、工程結構 我模擬了 sso的客戶端和sso的服務端&#xff0c; sso-core中主要是…

maven deploy上傳私服出錯

error 內容如下 Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.5: deploy (default-deploy) on project XXX pom文件增加如下配置 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifa…

加密策略

一、前言 這兩天研究了一下項目中的密碼加密&#xff0c;可以說得上是學到了很多。下面來大致說一下。 二、常用加密 1.單向加密算法 單向加密算法主要用來驗證數據傳輸的過程中&#xff0c;是否被篡改過。 BASE64 嚴格地說&#xff0c;屬于編碼格式&#xff0c;而非加密算法 …

Spring Data JPA: 實現自定義Repository

一、前言 由于項目中的 實體&#xff08;entity&#xff09;默認都是繼承一個父類&#xff08;包含一些公共的屬性&#xff0c;比如創建時間&#xff0c;修改時間&#xff0c;是否刪除&#xff0c;主鍵id&#xff09;。為了實現邏輯刪除&#xff0c;一般會自己實現RepositoryFa…

java json和對象互相裝換

java json和對象互相裝換 1.com.alibaba.fastjson.JSON 2.com.fasterxml.jackson.databind.ObjectMapper 轉載于:https://www.cnblogs.com/hujunzheng/p/6593491.html

js沖刺一下

js中__proto__和prototype的區別和關系 1.對象有屬性__proto__,指向該對象的構造函數的原型對象。  2.方法除了有屬性__proto__,還有屬性prototype&#xff0c;prototype指向該方法的原型對象。 深入淺出妙用 Javascript 中 apply、call、bind ***兩道面試題*** 關于js中偽數…

springmvc 源碼分析

DispatcherServlet的初始化流程 HandlerMapping - RequestMappingHandlerMapping初始化 DefaultAnnotationHandlerMapping 和RequestMappingHandlerMapping RequestToViewNameTranslator請求到視圖名稱的轉換 (如果沒有responsebody&#xff0c;并且沒有返回一個view&#xff0…

EntityManager的使用

1、最基礎的查詢 CriteriaBuilder cb entityManager.getCriteriaBuilder(); CriteriaQuery<User> cq cb.createQuery(User.class); Root<User> root cq.from(User.class); //from User cq.select(root); //select * from User javax.persistence.criteria.Predi…

Jackson序列化實例

參考文章 Jackson使用ContextualSerializer在序列化時獲取字段注解的屬性 使用BeanSerializerModifier定制jackson的自定義序列化(null值的處理) 關于使用ContextualSerializer的補充 BeanSerializerFactory中有如下代碼&#xff0c; 關于設置SerializerModifier&#xff0c;如…

maven自定義腳手架(快速生成項目)

Maven之自定義archetype生成項目骨架 利用腳手架生成 新項目 命令行方式 mvn archetype:generate \ -DarchetypeGroupIdcom.xxx \ -DarchetypeArtifactIdarchetype-spring-boot \ -DarchetypeVersion1.0.0 \ -DgroupIdcom.xxx \ -DartifactIddemo-archetype-generate \ -Dversi…

JSONObject 自定義過濾配置

一、自定義過濾器說明 PropertyPreFilter 根據PropertyName判斷是否序列化   PropertyFilter 根據PropertyName和PropertyValue來判斷是否序列化   NameFilter 修改Key&#xff0c;如果需要修改Key,process返回值則可   ValueFilter 修改Value   BeforeFilter 序列化時…

springmvc防止重復提交攔截器

一、攔截器實現&#xff0c;ResubmitInterceptorHandler.java import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.Hand…

Mac idea 快捷鍵

Mac鍵盤符號和修飾鍵說明 ? Command? Shift? Option? Control?? Return/Enter? Delete? 向前刪除鍵&#xff08;FnDelete&#xff09;↑ 上箭頭↓ 下箭頭← 左箭頭→ 右箭頭? Page Up&#xff08;Fn↑&#xff09;? Page Down&#xff08;Fn↓&#xff09;Home Fn ←…

cas4.2.7實現單點登錄

準備前參考&#xff1a;  cas server下載地址 cas client 下載地址 安全cookie setSecure詳解 Spring通過構造方法注入的四種方式 cas 學習博文 自定義登錄頁和登錄認證 cas server端的login-webflow詳細流程 CAS服務端自定義數據庫認證用戶 準備工作 1. cas server下載之后解…

log4j之log4j2.xml使用

依賴jar包 log4j-api-2.6.2.jar log4j-core-2.6.2.jar log4j-slf4j-impl-2.6.2.jar slf4j-api-1.7.12.jar 在resources目錄下新建log4j2.xml&#xff0c;內容如下。 <?xml version"1.0" encoding"UTF-8"?><!--status : 這個用于設置log4j2自身內…

cas4.2.7與shiro進行整合

準備工作 cas單點登錄開始前準備&#xff0c;請參考cas4.2.7實現單點登錄。 與shiro進行整合 注&#xff1a;準備工作的基礎上&#xff0c;對cas客戶端進行如下改進。 引入相關jar包 shiro-cas-1.2.6.jar shiro-core-1.2.6.jar shiro-spring-1.2.6.jar shiro-web-1.2.6.jar web…

命令行fuck神器

文章 thefuck git thefuck 轉載于:https://www.cnblogs.com/hujunzheng/p/6935587.html

springmvc配置MappingJackson2HttpMessageConverter實現屬性駝峰和下劃線的轉換

需求 php調用java接口時&#xff0c;因為php那邊的屬性都是下劃線風格&#xff0c;java這邊的屬性都是駝峰的風格。配置springmvc的json轉換&#xff0c;在requestBody的時候&#xff08;調用對象的set 方法&#xff09;將java屬性name映射成下劃線形式 和 請求的參數匹配&…